如何避免在Python 3中的函数调用中出现重复的参数

时间:2019-11-19 08:59:46

标签: python python-3.x arguments

如何避免在类似的方法调用中一遍又一遍地在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)

1 个答案:

答案 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

在某些情况下,我发现这比通过字典更舒服。