如何避免在类似的方法调用中一遍又一遍地在Python中重复相同的参数?
例如在此代码段中:
for col in self.numerical_columns:
self.comp_train_df = self.comp_train_df.merge(self.get_aggregates(self.train_df, col), left_index=True, right_index=True)
self.comp_test_df = self.comp_test_df.merge(self.get_aggregates(self.test_df, col), left_index=True, right_index=True)
重复这些参数:
left_index=True, right_index=True
理想情况下,您将在变量中定义重复的参数并重新使用它们。我已经尝试了这段代码,但是作为Python新手,我不确定这是否是正确的方法:
merge_args = {'left_index':True, 'right_index':True}
for col in self.numerical_columns:
self.comp_train_df = self.comp_train_df.merge(self.get_aggregates(self.train_df, col), **merge_args)
self.comp_test_df = self.comp_test_df.merge(self.get_aggregates(self.test_df, col), **merge_args)
答案 0 :(得分:1)
这是一个有趣的问题,我记得我曾经用装饰器做到这一点。这可能是过大的,但也许值得考虑。
考虑具有多个关键字参数的函数,例如该函数:
def yell(sound='woof', volume='loud', pitch='high')
return f'{sound} -> {volume} -> {pitch}'
假设您要连续多次使用此功能,但音量仅中等。在这种情况下,您每次都必须使用volume参数调用该函数。除了执行此操作外,您还可以装饰函数并根据自己的喜好更改其默认参数。
def change_default(**new_kwargs):
def wrapper(func):
def new_fn(*args, **kwargs):
for key, val in kwargs.items():
if key in new_kwargs:
new_kwargs[key] = kwargs.pop(key)
return func(*args, **kwargs, **new_kwargs)
return new_fn
return wrapper
基本上,您可以创建一个可参数化的装饰器,该装饰器将使用您的函数并更改其默认参数。所有其他kwarg均不受影响,但可以根据需要手动更改。
回到用例,您将像这样装饰它:
@change_default(volume='medium')
def yell(sound='woof', volume='loud', pitch='high')
return f'{sound} -> {volume} -> {pitch}'
调用yell函数后,它将返回:
woof -> medium -> high
在某些情况下,我发现这比通过字典更舒服。