[英]Passing keyword arguments to a function when local variable names are same as function parameter names
有沒有更簡潔的方法來寫這個?
f(a=a, b=b, c=c, d=d, e=e)
背景:我有一個 function 太多 arguments
f(a, b, c, d, e):
pass
在我的程序中,我有與 function 參數命名完全相同的局部變量。
a, b, c, d, e = range(5)
我想用關鍵字 arguments 調用 function。 由於變量的名稱相同,這就是調用的外觀。
g = f(a=a, b=b, c=c, d=d, e=e) # this can get very long
當然,我可以使用 position 而不是這樣的關鍵字來傳遞參數
g = f(a, b, c, d, e)
但是a
, b
, c
, d
, e
只是這個例子中的變量名稱,很容易看出正確的順序。 然而不幸的是,我的程序中的變量命名更復雜,沒有容易辨別的自然順序。 所以我真的很喜歡按關鍵字傳遞它們以避免任何錯誤。
您可以執行以下操作:
a, b, c, d, e = range(5)
arg_dict = lambda l: dict((k, globals()[k]) for k in l.split(', '))
arg_dict('a, b, c, d, e') => {'a': 0, 'c': 2, 'b': 1, 'e': 4, 'd': 3}
,所以你可以像這樣調用您的 function:
f(**arg_dict('a, b, c, d, e'))
這使您能夠准確指定要使用的變量。 不使用globals()
的另一種方法是使用eval()
,但它可能使使用 lambda 可能不安全。
arg_dict = lambda l: dict(zip(l.split(', '), eval(l)))
如果您希望將locals()
作為參數傳遞,而不是在 lambda 中使用globals()
,則可以使用以下命令:
arg_dict = lambda l, d=locals(): dict((k, d[k]) for k in l.split(', '))
f(**arg_dict('a, b, c, d, e'))
感謝senderle的locals()
建議。
locals()
給出你的局部變量,所以你可以這樣做
def somewhere():
x = 3 # its a local
f(**locals()) # same as f(x=3)
但你肯定可以看到這是多么脆弱。
為什么不能在這里使用**kw?
def foo(**kw):
for k,v in kw.items():
print k,v
foo(a=2)
foo(a=3, b=4)
foo(nonsene=True, blather=False)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.