为 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.list1
对 if default
的用途是什么。
因为那部分与其他所有部分都不兼容。
在 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.list1
对 if default
的用途是什么。
因为那部分与其他所有部分都不兼容。