python - 无和之间的区别
问题描述
我熟悉 Javanull
和 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()
实际上是一个代理函数;它将实际工作委托给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 中,一切都是对对象的有效引用。(最多,如果您尝试在其命名空间中使用尚未绑定的名称,您会得到一个或异常)。null
nullptr
None
null
nullptr
NameError
UnboundLocal
推荐阅读
- python - 如何在 python 中更快地计算多个点组合之间的最小地理距离?
- javascript - 如何在 Ionic React 中通过 onChange 调用传递切换状态?
- ubuntu - jupyter notebook 打不开:拒绝访问
- swift - collectionView 不 scrollToItem - swift - 以编程方式
- angular - 在 scrollDispatcher Angular Material 上滚动的方法总是返回 undefined
- r - 试图协调 R Shiny 反应值中的日志记录和 textOutput
- android - 工具栏正在覆盖 Recyclerview
- r - 在R中重复向量化矩阵的最佳方法?
- javascript - 获取异步变量返回空
- java - Java WebLookAndFeel 不显示 JXTable 的列控制弹出菜单