为 Python 中的函数传递相同的参数名称

Passing same argument names for a function in Python

在 python 中,我有一个 class 函数打印某些输出,其中每个都有默认参数但可以更改,例如

def func1(self,a='a', b='b'):
    return something
def func2(self,c='c', d='d'):
    return something 

还有很多其他类似的功能。

我创建了另一个函数,可以将这些函数与参数一起使用,并且可以用它们做一些事情,即

def foo(self, default,*args,**kwargs):
    df=self.df
    if default == True:
        args = self.list1
    else:
        for fname in args:
            getattr(self, fname)(*kwargs)
            df['appending_array'] = df.apply(lambda...

实际上我希望能够调用类似 object.foo(假, func2,func11,d='z') 不幸的是,在循环中,当我将 d 更改为 'z' 时,它会更改迭代的每个函数的第一个参数,而不是我想要的函数的实际参数 d。

是否有可能重新排列它以便我可以传递每个传递函数的原始参数,或者配置 **kwarg 以便它可以引用每个函数的原始参数名称?

非常感谢任何 help/advice

您需要使用两颗星通过字典解包来解包 kwargs:

getattr(self, fname)(**kwargs)

而且我认为您还需要提供 self 作为第一个参数,因为这些是未绑定的方法:

getattr(self, fname)(self,**kwargs)

所以,如果我理解正确的话,你想这样写,例如,如果 d 出现在 foo 调用中,它只传递给 [=] 中的所有函数13=] 将 d 作为输入参数(在本例中为 func2)?

如果是这样,那么您想确定每个函数可以采用的所有输入参数。 幸运的是,Python 有一个函数可以让你做到这一点:inspect.signature.

所以,您可以像这样重写它(我假设您想将函数名称作为 args 传递,而不是实际函数本身):

from inspect import signature

def foo(self, default, *args, **kwargs):
    df=self.df

    if default:
        args = self.list1
    else:
        for fname in args:
            # Obtain function
            func = getattr(self, fname)

            # Obtain signature of this function
            f_sig = signature(func)

            # Create dict with values for this function, updating with values from kwargs
            # Make sure to skip 'self'
            f_kwargs = {argname: kwargs.get(argname, argpar.default)
                        for argname, argpar in f_sig.parameters.items()
                        if (argname != 'self')}

            # Call this function
            f_out = func(**f_kwargs)

            # Perform some operations on the output of this function
            df['appending_array'] = df.apply(lambda...

请记住,只有当每个作为 args 传递的函数只接受可选参数时,这才有效。 如果一个参数是必需的,则必须将其传递给 kwargs.

PS:但是我不确定 args = self.list1if default 的用途是什么。 因为那部分与其他所有部分都不兼容。