簡體   English   中英

函數調用中有多個 kwargs?

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

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