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()
有多个参数,则比您的解决方案更容易。
假设我有一个带有默认参数的函数和另一个调用它的函数。我想让调用者覆盖默认参数或保留它。我陷入了以下模式。这是反模式吗,这是最佳实践吗,有没有更好的方法?
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()
有多个参数,则比您的解决方案更容易。