程序员A编写以下函数:
def compute_value(threshold = sys.float_info.max):
...
return value
具有可选参数阈值,以自然方式将最大浮点值作为默认值来表示"无阈值"。
程序员B也有阈值表示,但使用None表示没有阈值。不幸的是,如果threshold = None,则compute_value函数不会引发任何异常,但会给出错误的答案。因此程序员B将None作为阈值时会出现错误。
我想说最好的解决方案是改变
中的功能def compute_value(threshold = None):
if threshold is None:
threshold = sys.float_info.max
...
return value
因为这个函数比以前更通用,因为它以一种有意义的方式处理None值。
这提出了一个问题:是否最好只使用None作为默认值?
默认参数与None不同的函数不是第一次给我带来麻烦。在其他情况下,我发现自己要从kwargs字典中删除None值...
另一个相关(可能是愚蠢的)问题。实际上程序员B修改了上面的功能如下:
def compute_value(threshold = sys.float_info.max):
if threshold is None:
threshold = sys.float_info.max
...
return value
这是完全正确但对我来说似乎很糟糕。不好因为sys.float_info.max重复了两次......但是:这是否违反DRY原则?因为,严格来说,在第一个实现中也会重复两次None,并且None和sys.float_info.max都是常量。
答案 0 :(得分:4)
这实际上归结为您(API提供者)是否认为None
应该是传递给函数的有效参数。就个人而言,在这种情况下,我认为我会使用sys.float_info.max
并禁止使用None
。毕竟,None
为什么要伪装成float
? 规范使用None
作为默认参数是在需要可变默认参数时,但这不是这里的情况。
有一个论据要反过来 - 如果你使用None
,那么help
会告诉你阈值是None
,这从&#中有所帮助34;将代码读作文本"透视。 (毕竟,你的意思是没有门槛)。 1
但最终,它在这一点上大多只是分裂。选择一个约定,记录它并坚持下去。不要太担心它。
1 如果您有自动生成的文档(例如sphinx)并且sys.float_info.max
在生成计算机的计算机上没有返回相同的值,情况会更糟文档与运行代码的计算机相比较。这种情况非常不可能 - 大多数计算机现在都同意IEEE,但......
答案 1 :(得分:1)
您还可以使用kwargs
解决None
默认值
def compute_value(**kwargs):
threshold = kwargs.get('threshold', sys.float_info.max)
...
return value