簡體   English   中英

將 kwargs 顯式傳遞給函數參數

[英]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.

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