python non无默认值

时间:2014-05-15 06:56:20

标签: python default-value

程序员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都是常量。

2 个答案:

答案 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