У меня есть функциональный модуль, в котором есть некоторые функции с некоторыми общими входными данными, а также другие, специфичные для них. например
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
предназначен для функций, в которых количество входных параметров неизвестно, но я пытаюсь использовать его в случае, когда количество входных параметров известно, но варьируется для разных функций в цикле.
Есть ли какое-либо исправление для этого, когда мне не нужно изменять модуль функций и я могу передать все необходимые параметры как один объект (e.g. 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')
где xi экземпляр вашего класса X
Можно ли это улучшить, чтобы я мог передавать аргументы, отличные от time_series и window, в качестве значения поиска в цикле, например.
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
x.generate_outputs(time_series, window ='1D', params [i])
гдеparams[i] = max_lag=25, use_probability ='T'
12.11.2017