簡體   English   中英

如何在Python中使用* args

[英]How to use *args in python

我有一個功能模塊,其中的一些功能全部帶有一些常見的輸入,而另一些則特定於它們。 例如

def func_a(time_series, window ='1D'):

def func_b(time_series, window ='1D', availability_history ): 

def func_c(time_series, window ='1D', max_lag=25, use_probability ='T'):

我試圖按如下所示循環運行這些功能:

func_list = [func_a, func_b, func_c]
windows = ['1D', '5D']
params = ['', hist, (25, 'T')]

for i_func, func in enumerate(func_list):
    class_obj = class_X(A,B,func)

    for window in windows:
        args = (window, params[i_func]) # params is a list or tuple of other params for funcs e.g. 
        class_obj.run_func(args)

在另一個模塊中

class class_X(object):
    def __init__(self, a, b, func_to_run):
        self.a = a
        self.ts = b
        self.method = func_to_run

    def generate_output(self, *args):
        return self.method(self.ts, args) # time series is common and fixed for all, other params differ or change

上面的代碼行不通,因為我認為我要調用的函數需要更改以使用*args而不是具有固定的已定義參數。

我認為*args用於未知輸入參數數量的函數,但是我嘗試在已知輸入參數數量但在循環中跨不同函數變化的情況下使用它。

有什么解決辦法,我不必修改功能模塊,仍然可以將所有必需的參數作為單個對象傳遞( eg list or tuple )?

編輯-

macromoonshine的回答指出,我可以像這樣使用kwargs:

def generate_output(self, **kwargs):
    return self.method(self.ts, kwargs)

通過此修改,您可以按以下方式調用generate_outputs():

x.generate_outputs( window ='1D', max_lag=25, use_probability ='T')

其中x是類X的實例

是否可以增強此功能,以便我可以將time_series和window以外的args作為循環中的查找值傳遞給例如

x.generate_outputs( window ='1D', params[iloop])

哪里

params[iloop] = max_lag=25, use_probability ='T'

我嘗試這樣做:

params = (30, "F")
x.generate_outputs( window, *params)

但出現錯誤

TypeError: generate_output() takes 1 positional argument but 4 were given

您可以改用**kwargs ,它允許使用任意關鍵字參數。 這比修改每個函數要容易。 您只需修改代碼中的generate_outputs()方法即可:

def generate_output(self, **kwargs):
    return self.method(self.ts, kwargs)

通過此修改,您可以按以下方式調用generate_outputs()

x.generate_outputs(time_series, window ='1D', max_lag=25, use_probability ='T')

其中x是類X的實例。

如果要通過dict而不是命名參數傳遞kwargs ,則必須在字典變量前加上** 改編后的代碼應如下所示:

params = [{max_lag: 35, use_probability: 'F'}, ... ]
TS= [1,2,3,4]

for i_func, func in enumerate(func_list):
    class_obj = class_X(TS, func)
    for window in windows:
        req_args = dict(params[i_func])
        req_args['window'] = 0
        class_obj.generate_output(**req_args)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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