如何传播默认值

支持我定义了一些函数,例如(非常简化的例子)


def f1(a, b, arg='something'):

   ...

def f2(c, arg='else'):

   ...

然后我称使用它们为:


def f(a, b, c):

   return f1(a, b) + f2(c)

由于这是非常常用的,但我想单独定义f1和f2定义,以便可以只调用一个。


我想有通话时可能f调用f1,并f2用不同的默认参数,所以我可以做:


def f(a, b, c, arg1='something', arg2='else'):

   return f1(a, b, arg1) + f2(c, arg2)

这不是很容易实现(我有比 2 个更多的函数和更多的参数),因为当我更新一个函数时,我需要更新f. 一种选择是使用None默认值,然后在函数体内更改它们,例如


def f1(a, b, arg=None):

   arg = arg or 'something'

   ...

但这隐藏了签名中默认参数的真实值。此外,这并不能解决我所有的问题,因为如果我添加一个新参数,f1我必须更改 的签名f及其实现...


MM们
浏览 171回答 3
3回答

ibeautiful

听起来您已经到了面向对象编程可以帮助您的地步。您可以将函数重写为类: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.

蝴蝶不菲

尝试使用此功能!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))

人到中年有点甜

def f1(a, b, arg='something', **kwargs):   passdef f2(c, arg='else', **kwargs):   passdef 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))
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python