Ema*_*ini 4 python default-value
程序员 A 编写了以下函数:
def compute_value(threshold = sys.float_info.max):
...
return value
Run Code Online (Sandbox Code Playgroud)
它具有可选参数阈值,它以自然的方式将最大浮点值作为默认值来表示“无阈值”。
程序员 B 也有一个阈值的表示,但是用 None 来表示没有阈值。不幸的是,如果阈值=无,compute_value 函数不会引发任何异常,但给出了不正确的答案。因此,当程序员 B 通过 None 作为阈值时,会出现错误。
我会说最好的解决方案是更改功能
def compute_value(threshold = None):
if threshold is None:
threshold = sys.float_info.max
...
return value
Run Code Online (Sandbox Code Playgroud)
因为这个函数比以前更通用,因为它以一种有意义的方式处理 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
Run Code Online (Sandbox Code Playgroud)
这是完全正确的,但对我来说似乎很糟糕。不好,因为 sys.float_info.max 重复了两次……但是:这是否违反了 DRY 原则?因为,严格来说,在第一个实现中 None 也重复了两次,并且 None 和 sys.float_info.max 都是常量。
这实际上归结为您(API 提供者)是否认为这None应该是传递给函数的有效参数。就个人而言,在这种情况下,我认为我会使用sys.float_info.max和禁止使用None. 毕竟,为什么要None伪装成float?作为默认参数的规范使用None是当您需要可变的默认参数时,但情况并非如此。
有一个相反的论点 - 如果您使用None, 那么help会告诉您阈值是None,从“将代码作为文本阅读”的角度来看,这是有道理的。(毕竟,你的意思是没有门槛)。1
最终,它在这一点上主要只是分裂头发。选择一个约定,记录下来并坚持下去。不要太担心。
1如果您有自动生成的文档(例如 sphinx),sys.float_info.max并且在生成文档的计算机上返回的值与运行代码的计算机不同,则情况会更糟。这种情况不太可能发生——如今大多数计算机都同意 IEEE,但是……
| 归档时间: |
|
| 查看次数: |
1592 次 |
| 最近记录: |