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

用于保留子函数默认参数的 Python 模式

用于保留子函数默认参数的 Python 模式

繁花不似锦 2021-06-14 16:39:57
假设我有一个带有默认参数的函数和另一个调用它的函数。我想让调用者覆盖默认参数或保留它。我陷入了以下模式。这是一个反模式,这是最佳实践,有没有更好的方法?def subfunc(x=10):    # do something with xdef callingfunc(x=None):    y= subfunc() if x is None else subfunc(x) # IS THIS AN ANTI PATTERN?
查看完整描述

2 回答

?
RISEBY

TA贡献1856条经验 获得超5个赞

大多数情况下,为此使用可选的 varargs ( *args) 和/或(最好是 imho)可选的关键字 args ( **kwargs)。假设callingfunc()还需要一些自己的参数y:


def subfunc(x=10):

    """ Do something with x


    :param x: used to do something (default: 10)

    """

    print("subfunc({})".format(x))


def callfunc(y, **kwargs):

    """ Do something with `y` and calls `subfunc()`


    :param y: something to do something with

    :param kwargs: will be passed to `subfunc()` (cf `subfunc() doc)`

    """ 


    print("callfunc({})".format(y))

    subfunc(**kwargs)



callfunc(42)

callfunc(42, x="bar")

这让您很容易知道哪些是callfunc()自己的参数,哪些仅用于subfunc(),并且如果subfunc()有多个参数,则比您的解决方案更容易。


查看完整回答
反对 回复 2021-06-22
?
一只斗牛犬

TA贡献1784条经验 获得超2个赞

这个答案总是覆盖subfunc x参数,因为没有subfunc定义的x参数就无法调用 。所以这是不对的。


我没有修复它,因为布鲁诺的答案已经很好了。


你可以这样写:


def subfunc(x=10):

    print(x)


def callingfunc(x=None):

    subfunc(x)


callingfunc()

callingfunc(20)

callingfunc(30)

它打印:


None

20

30

因此,您要么传递一个覆盖 10 的值,要么不传递,并使用callingfuncx的默认值覆盖 10 ,在本例中为None。


查看完整回答
反对 回复 2021-06-22
  • 2 回答
  • 0 关注
  • 119 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信