为了账号安全,请及时绑定邮箱和手机立即绑定

如何传播默认值

如何传播默认值

MM们 2021-08-05 18:14:08
支持我定义了一些函数,例如(非常简化的例子)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及其实现...
查看完整描述

3 回答

?
ibeautiful

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.


查看完整回答
反对 回复 2021-08-05
?
蝴蝶不菲

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))


查看完整回答
反对 回复 2021-08-05
?
人到中年有点甜

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))


查看完整回答
反对 回复 2021-08-05
  • 3 回答
  • 0 关注
  • 170 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号