2017-07-18 17 views
1

私たちは、私はこのような機能を持っているとしましょう:関数の引数の動的変数

helloWorld(myMsg = 'hello, world') 
helloWorld(anotherMessages = 'no, no this is hard') 

しかし、ハードの部分は、私が動的に名前を付けたいことです:

def helloWorld(**args): 
    for arg in args: 
     print(args[arg]) 

この関数を呼び出すには簡単です。変数からの引数はリストや他のどこかから来ます。そして私はmyMsgとanotherMessagesをリストから渡すことを望んでいるでしょう(例えば、私は愚かな難しい部分です。関数の入力となるように文字列を変数に取り込む方法が必要です)。

list_of_variable_names = ['myMsg','anotherMessages'] 
for name in list_of_variable_names: 
    helloWorld(name = 'ooops, this is not easy, how do I pass a variable name that is stored as a string in a list? No idea! help!') 

答えて

1

あなたは、変数を使用して辞書を作成し、その関数に渡しながら解凍することができます。

list_of_variable_names = ['myMsg','anotherMessages'] 
for name in list_of_variable_names: 
    helloWorld(**{name: '...'}) 
+0

興味深いことに、私はそれを試してみましょう – Dnaiel

3

** syntaxは開梱辞書です。 あなたの関数では、args(通常はkwargs)は辞書です。

したがって、アンパック辞書を渡す必要があります。これは、f(a=1, b=2)が呼び出されたときの処理です。例えば

kwargs = {'myMsg': "hello, world", 'anotherMessages': "no, no this is hard"} 
helloWorld(**kwargs) 

その後、あなたは辞書としてkwargs取得します。

def f(**kwargs): 
    for k, v in kwargs.items(): 
     print(k, v) 

>>> kwargs = {'a': 1, 'b': 2} 
>>> f(**kwargs) 
a 1 
b 2 

あなたがそうしたい場合は、Moses suggestedとして、その場で辞書を作成し、それを開梱することにより、同様にすべての名前のために一度の関数を呼び出すことができます。

def f(**kwargs): 
    print("call to f") 
    for k, v in kwargs.items(): 
     print(k, v) 

>>> for k, v in {'a': 1, 'b': 2}: 
...  kwargs = {k: v} 
...  f(**kwargs) 
... 
call to f 
a 1 
call to f 
b 2 
+0

ありがとうたくさん、超回答! – Dnaiel