[英]Pass kwargs to function argument explictly
Python 中有沒有辦法將字典顯式傳遞給函數的**kwargs
參數? 我正在使用的簽名是:
def f(*, a=1, **kwargs): pass # same question with def f(a=1, **kwargs)
我試圖通過以下方式調用它:
my_dict=dict(b=2)
f(kwargs=my_dict) # wrong, kwargs receives {'kwargs': {'b': 2}} instead of {'b': 2}
f(**kwargs=my_dict) # SyntaxError: invalid syntax
f(kwargs=**my_dict) # SyntaxError: invalid syntax
我想這樣做的原因是我傳入的字典可能包含鍵a
,我不希望它污染f
的參數a
:
overlap_dict=dict(a=3,b=4)
f(**overlap_dict) # wrong, 'a' is 3, and 'kwargs' only contains 'b' key
f(a=2, **overlap_dict) # TypeError: f() got multiple values for keyword argument 'a'
用f
簽名中的字典替換**kwargs
對我來說不是一個選擇。
用a
更新kwargs
,然后通過它。 例如,假設您有一個值a=1
,然后這樣做。
kwargs["a"] = a
f(**kwargs)
您可以臨時(或永久,如果需要,只需刪除最后一行)修改f
以將kwargs
作為關鍵字參數。 請注意,這是一個有點邪惡的 hack,所以我敦促您先嘗試其他解決方法。
import inspect
def f(*, a=1, **kwargs):
print(a)
print(kwargs)
code = f.__code__
f.__code__ = code.replace(
co_kwonlyargcount=code.co_kwonlyargcount + 1,
co_flags=code.co_flags - inspect.CO_VARKEYWORDS,
)
f(kwargs={"a": 3, "b": 4})
f.__code__ = code
這打印:
1
{'a': 3, 'b': 4}
如果您不想更改f
以接受更多參數,您可以簡單地創建a
列表,第一個條目是f
,第二個條目是kwargs
,例如:
def f(*, a, **kwargs):
if len(a) == 1:
a = a[0]
elif len(a) == 2:
kwargs['a'] = a[1]
a = a[0]
你也可以用字典做類似的事情:
def f(*, a, **kwargs):
if 'kwargs' in a.keys():
kwargs['a'] = a['kwargs']
a = a['f']
或者,這確實改變了f
的參數輸入,但我認為它更清晰一些。 我能想到的有2個案例。 首先,如果您知道a
將始終設置在kwargs
中:
def f(*, a, a2, **kwargs):
kwargs['a'] = a2
另一種情況是,如果您希望a
是否傳遞給kwargs
是可選的:
def f(*, a, a2=None, pass_a=False, **kwargs):
if pass_a:
kwargs['a'] = a2
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.