簡體   English   中英

當局部變量名稱與 function 參數名稱相同時,將關鍵字 arguments 傳遞給 function

[英]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'))

感謝senderlelocals()建議。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM