,python,numpy"/>

首页 > 解决方案 > 无和之间的区别

问题描述

我熟悉 Javanull和 C++ nullptr,以及来自几种脚本语言的类似概念。None看起来非常像同一旧主题的 Python 版本。

然后我遇到了这个函数声明:

 numpy.amin(a, axis=None, out=None, keepdims=<no value>, initial=<no value>, where=<no value>)

None和有什么区别<no value>?我猜这只是在没有定义默认值时生成文档的事情,但是为什么不根本不列出默认值呢?

标签: pythonnumpy

解决方案


它只是一个文档的东西, 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()实际上是一个代理函数;它将实际工作委托给numpy.minimum()(通过ufunc.reduce(),或者,如果第一个参数是实现amin()方法的子类,则委托给子类的该方法。因为后者应该能够设置自己的默认值,所以使用哨兵可以让numpy.amin()实现通过仅在那些实际上被赋予显式值的关键字参数上,而不规定子类.amin()实现应该使用什么样的哨兵或它们接受什么类型。

Numpy 项目实际上创建了他们自己的单例类来充当哨兵,因此他们可以为对象提供有用的repr()输出:

>>> from numpy._globals import _NoValue
>>> _NoValue
<no value>
>>> type(_NoValue)
<class 'numpy._globals._NoValueType'>

最后,None应该与or比较。是一个单例对象,可以引用而不是另一个对象。和用于表示没有引用,并且可以像其他标量值一样传递。你不能在 Python 中做到这一点,在 Python 中,一切都是对对象的有效引用。(最多,如果您尝试在其命名空间中使用尚未绑定的名称,您会得到一个或异常)。nullnullptrNonenullnullptrNameErrorUnboundLocal


推荐阅读