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

Python pattern for keeping default arguments of subfunction

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

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?

编辑: 这个答案总是覆盖 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 的值,要么不传递,然后覆盖 10 x 的 callingfunc 默认值,在本例中为 None.

大多数情况下,人们为此使用可选的可变参数(*args)and/or(最好是恕我直言)可选的关键字参数(**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() 有多个参数,则比您的解决方案更容易。