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

假设我有一个带有默认参数的函数和另一个调用它的函数。我想让调用者覆盖默认参数或保留它。我陷入了以下模式。这是一个反模式,这是最佳实践,有没有更好的方法?


def subfunc(x=10):

    # do something with x


def callingfunc(x=None):

    y= subfunc() if x is None else subfunc(x) # IS THIS AN ANTI PATTERN?


繁花不似锦
浏览 120回答 2
2回答

RISEBY

大多数情况下,为此使用可选的 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()有多个参数,则比您的解决方案更容易。

一只斗牛犬

这个答案总是覆盖subfunc x参数,因为没有subfunc定义的x参数就无法调用 。所以这是不对的。我没有修复它,因为布鲁诺的答案已经很好了。你可以这样写:def subfunc(x=10):    print(x)def callingfunc(x=None):    subfunc(x)callingfunc()callingfunc(20)callingfunc(30)它打印:None2030因此,您要么传递一个覆盖 10 的值,要么不传递,并使用callingfuncx的默认值覆盖 10 ,在本例中为None。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python