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

4

如何在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
这是定义字典并将它们作为关键字参数使用的正确方法。 - Randrian
@Randrian 非常感谢您的确认。我没有看到这种技术被广泛使用,只是大多数时候听说过将 **kwargs 作为函数参数,并认为这可能是正确的方法。 - gil.fernandes
1个回答

4

这是一个有趣的问题,我记得曾经使用过装饰器来完成。可能有点过度设计,但值得考虑。

考虑一个有多个关键字参数的函数,例如下面的函数:

def yell(sound='woof', volume='loud', pitch='high')
    return f'{sound} -> {volume} -> {pitch}'

假设您想连续多次使用此函数,但音量只有中等大小。在这种情况下,您必须每次使用带有音量参数的函数来调用它。相反,您可以装饰该函数并将其默认参数更改为您喜欢的值。

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

基本上,您可以创建一个可参数化的装饰器,它接受您的功能并更改其默认参数。所有其他kwargs不受影响,但如果需要,可以手动更改它们。
回到用例,您可以这样装饰它:
@change_default(volume='medium')
def yell(sound='woof', volume='loud', pitch='high')
    return f'{sound} -> {volume} -> {pitch}'

调用yell函数后,它返回:
woof -> medium -> high

在某些情况下,我发现这比传递一个字典更舒适。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接