【问题标题】:Distinguishing argument value of `None` from the default parameter value of `None` [duplicate]将“None”的参数值与“None”的默认参数值区分开来[重复]
【发布时间】:2012-10-12 23:32:12
【问题描述】:

可能重复:
Is there any way to know if the value of an argument is the default vs. user-specified?
python - returning a default value

Python 的标准做法是使用None 作为默认参数值。

但是,如果客户端代码可能使用 None 作为合法参数值,这种惯用用法就不能很好地工作。在这种情况下,函数无法判断客户端代码是否省略了参数,或者它是否显式传递了None。这不好,除非(幸运地)函数的行为在两种情况下应该是相同的。

什么是好的解决方案?

【问题讨论】:

  • @JoshCaswell:我的副本更好地涵盖了这一点;另一个谈论使用None 作为默认值,而None 不是该函数的合法值。

标签: python function python-3.x


【解决方案1】:
_NOT_SET = object()

def some_function(some_arg=_NOT_SET):
    if some_arg is _NOT_SET:
        # ...

任何类实例都具有is 可以区分的唯一标识。

【讨论】:

  • 有什么办法可以避免命名空间污染?我猜不是,因为默认参数值 has 将在执行函数定义时进行评估?
  • 正确。但是,如果您的函数很好地分解为模块和类,您可以使用可用的最紧密范围 - 例如,_NOT_SET 可以是类成员或模块成员,而不是整个程序的全局。使用以下划线开头的名称也有帮助 - 这是外部用户不应该关心的事情的 Python 约定。
  • 今晚从信号灯技巧中获得很多里程,Amber。 (参考关于基础对象实例的可能用途的问题)大声笑。不过我不赞成这个,因为 Q 是重复的。
  • 我只能看到一个丑陋的方式来做到这一点,说def some_function(some_arg = object()),然后使用inspec查找默认值...我不想这样做:)
  • @mjv 很好;我不为代表这样做。我添加这个答案而不是投票关闭的唯一原因是我认为链接的副本实际上并不能很好地解决 max 的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-05
  • 2019-06-01
  • 1970-01-01
  • 2013-02-14
  • 1970-01-01
相关资源
最近更新 更多