处理可选列表参数的传统方法如下:
def func(list_of_vals = None):
if list_of_vals is None:
list_of_vals = []
...
我想知道以下(较短的)版本是否有任何陷阱?为什么没有人这样做?是不是觉得比较晦涩难懂?
list_of_vals = list_of_vals or []
模式
if arg is None:
很常见,Python 开发人员很熟悉,并且没有奇怪的边缘情况。 我的建议是坚持惯例。
您使用
or
的建议在逻辑上偏离bool(list_of_vals) == False
但list_of_vals is not None
,所以我建议不要这样做。
另一个可能的选择是使用空元组“鸭子类型”:
def a(vals=()):
...
因为元组是不可变的,所以这没有可变默认列表的缺陷。在许多用例中,您只需要输入容器可索引和可迭代,因此
vals
可以愉快地保留为元组。
有两种情况,您希望可以在函数外部更改列表,那么第二个变体会阻止使用以下方式调用
a
:
some_list = []
a(some_list)
print(some_list)
如果你想防止列表参数发生变化,你应该在里面复制一份
a
def a(l=()):
l = list(l)
由于其他评论中提到的原因,输入空列表可能会与 None 混淆,我会这样做:
list_of_vals = [] if list_of_vals is None else list_of_vals
稍微冗长一些,但仍然是一句台词