3 回答

TA贡献1993条经验 获得超5个赞
听起来您已经到了面向对象编程可以帮助您的地步。您可以将函数重写为类:
class FFuncs:
def __init__(self, a, b, c, arg1="foo", arg2="bar"):
self.a = a
self.b = b
self.c = c
self.arg1 = arg1
self.arg2 = arg2
def f1(self):
return str(self.a + self.b) + self.arg1
def f2(self):
return str(self.c) + self.arg2
def f(self):
return self.f1() + self.f2()
FFuncs(2, 3, 5, arg1=" Foos and ", arg2=" Spam").f()
# Returns "5 Foos and 5 Spam"
现在,您始终可以在每次执行之前访问 kwargs 的默认值。正如评论中所提到的,如果您需要为类的任何给定方法提供特别灵活的调用签名,您仍然可以使用*args, **kwargs.

TA贡献1810条经验 获得超4个赞
尝试使用此功能!
def f(a, b, c, *args):
if len(args)==2:
return(f1(a, b, args[0]) + f2(c, args[1]))
else:
return(f1(a, b, None) + f2(c, None))

TA贡献1895条经验 获得超7个赞
def f1(a, b, arg='something', **kwargs):
pass
def f2(c, arg='else', **kwargs):
pass
def f(a, b, c, arg1='something', arg2='else'):
kwargs = locals()
return f1(**kwargs) + f2(**kwargs)
如果您想要来自两个世界的东西,即动态委托和静态定义,这是最简单的解决方案,但并不理想:
您必须添加**kwargs到函数中,以便在传递太多参数时它们不会失败;
你很容易就会逻辑错误的论点重命名,例如重命名c中f2来b。
如果您有许多fn功能,该return行可能会像这样结束:
return sum(f(**kwargs) for f in (f1, f2, ..., fn))
添加回答
举报