我熟悉Java的null
和 C++ 的 nullptr
,以及来自几种脚本语言的类似概念。 None
看起来非常像同一个旧主题的 Python 版本。
然后我遇到了这个函数声明:
numpy.amin(a, axis=None, out=None, keepdims=<no value>, initial=<no value>, where=<no value>)
None
和有什么区别和<no value>
?我猜这只是在没有定义默认值的情况下生成文档的事情,但是为什么不完全不列出默认值呢?
最佳答案
这只是一个文档内容,Python 本身没有这样的概念。
考虑到None
其本身也是一个有效的对象。有时你想接受None
作为参数的有效值,因此您不能将其用作可选参数的默认值。您将无法区分默认的 None
有人路过 None
明确地,因为它是单例!
如果我需要定义这样的函数,我会使用不同的单例哨兵。您可以从任何东西创建一个,但最简单的是使用 object()
实例:
_sentinel = object()
def foo(bar, baz=_sentinel):
if baz is not _sentinel:
# baz has a defined value, because it is
# not a reference to the sentinel
也许我也会使用<no value>
在文档中指出 baz
是可选的。这一切都取决于本地的惯例。 Python 文档本身使用 [...]
例如,围绕可选参数。
numpy.amin()
实际上是一个代理函数;它将实际工作委托(delegate)给 numpy.minimum()
(通过 ufunc.reduce()
,或者,如果第一个参数是实现 amin()
方法的子类,则为子类的该方法。因为后者应该能够设置自己的默认值,使用哨兵让 numpy.amin()
实现仅传递那些实际被赋予显式值的关键字参数,而不指定子类 .amin()
实现应使用哪种哨兵或它们接受什么类型。
Numpy 项目实际上 created their own singleton class to act as a sentinel这样他们就可以给这个物体一个有用的repr()
输出:
>>> from numpy._globals import _NoValue
>>> _NoValue
<no value>
>>> type(_NoValue)
<class 'numpy._globals._NoValueType'>
最后,None
不应该不与 null
进行比较或nullptr
。 None
是一个单例对象,是要引用的对象而不是另一个对象。 null
和nullptr
用于表示引用不存在,并且可以像其他标量值一样传递。在 Python 中你无法做到这一点,因为 Python 中的所有内容都是对对象的有效引用。 (如果您尝试使用尚未在其命名空间中绑定(bind)的名称,最多会收到 NameError
或 UnboundLocal
异常)。
关于python - None 和 <无值> 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60157865/