[英]Multiple kwargs in a function call?
我有一個簡單的函數,調用如下:
arbitrary_function(**kwargs1, **kwargs2, **kwargs3)
它似乎在我的本地安裝(python 3.5.1)上編譯得很好,但是當我在帶有 python 3.4.5 的 docker 上編譯它時會拋出一個 SyntaxError。
我不太確定為什么會出現這種行為。 不允許多個 kwargs 嗎? 我應該在傳遞給函數之前將它們組合起來嗎? 單獨傳遞它們更方便,例如:
plot(**x_axis_params, **y_axis_params, **plot_params)
代替
params = dict()
for specific_param in [x_axis_params, y_axis_params, plot_params]:
params.update(specific_param)
plot(**params)
這是 Python 3.5 中引入的一個新特性。 如果您必須支持 Python 3.4,那么您基本上會陷入update
循環。
人們對如何將多個 dicts 合並為一個有自己喜歡的變體,但唯一真正對update
循環有重大改進的是 3.5+ 獨占,所以它對此無濟於事。 (作為參考,新的 dict-merging 語法是{**kwargs1, **kwargs2, **kwargs3}
。)
PEP448(引入了 Python 特性)的基本原理中提到的一種解決方法是使用collections.ChainMap
:
from collections import ChainMap
plot(**ChainMap(x_axis_params, y_axis_params, plot_params))
ChainMap
是在 Python 3.3 中引入的,因此它應該可以在您的 docker 實例中運行。
您可以改用*args
,例如:
plot(*[x_axis_params, y_axis_params, plot_params])
然后在函數內:
def plot(*args):
x_axis_params = args[0]
y_axis_params = args[1]
plot_params = args[2]
return None
如果您在初始化類屬性時需要幾個**kwargs
,那么您也可以執行類似self.__dict__.update(**x_axis_params)
基於 @egorauto 的回答,我將 egorauto 的方法應用於 Kwargs 並發現它比for key,value in kwargs.items()
等其他方式更“方便”。回想起來,這似乎很明顯,但由於某種原因,我只是沒有嘗試過。 因為它對我有幫助,所以我也在這里發帖。
例如,
def test(name,**kwargs):
typex = kwargs['typex']
adjective = kwargs['adjective']
if typex == 'cat':
print(f"{name} is a {adjective} {typex}.")
elif typex == 'human':
gender = kwargs['gender']
print(f"{name} is a {adjective} {gender}.")
這很容易適應為上下文調用最小必要的 kwargs:
test(name='meowsie',typex='cat',adjective='cool')
“喵喵是一只很酷的貓”
或者
test(name='john',typex='human',adjective='young',gender='boy')
“約翰是個小男孩”
抱歉,我沒有專門針對 OP 調整該示例,但我不得不着急。 我認為很明顯你會使用 ' x_axis_param
' 而不是typex , ' y_axis_param
' 而不是adjective等。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.