python - None 和 <无值> 之间的区别

标签 python numpy

我熟悉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 进行比较或nullptrNone是一个单例对象,是要引用的对象而不是另一个对象。 nullnullptr用于表示引用不存在,并且可以像其他标量值一样传递。在 Python 中你无法做到这一点,因为 Python 中的所有内容都是对对象的有效引用。 (如果您尝试使用尚未在其命名空间中绑定(bind)的名称,最多会收到 NameErrorUnboundLocal 异常)。

关于python - None 和 <无值> 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60157865/

相关文章:

python - 将两个高斯组合成另一个高斯

python - 使用 Python 从文件中删除最后一列

python - 将多个 .xls 文件添加到单个 .xls 文件,使用文件名命名选项卡

python - 我将如何优化 Pandas 中的设置项

python - 在 linux 中执行 python 文件时权限被拒绝

python - NumPy:为什么需要显式复制一个值?

python - 我应该创建一个我经常使用的函数的 python 模块吗?

python - 使用python Mechanize访问时没有显示网站表,我如何找到它?

python - 我的 GMRES 实现有什么问题?

Python:以类似字典的方式直接访问属性