[英]Difference between None and <no value>
我熟悉 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()
實際上是一個代理函數; 它將實際工作委托給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
不應與比較null
或nullptr
。 None
是單例對象,可以引用而不是另一個對象。 null
和nullptr
用於表示沒有引用,並且可以像其他標量值一樣傳遞。 你不能在 Python 中做到這一點,在 Python 中,一切都是對對象的有效引用。 (如果您嘗試使用名稱空間中尚未綁定的名稱,則最多會出現NameError
或UnboundLocal
異常)。
np._NoValue
類的代碼:
class _NoValueType(object):
"""Special keyword value.
The instance of this class may be used as the default value assigned to a
deprecated keyword in order to check if it has been given a user defined
value.
"""
__instance = None
def __new__(cls):
# ensure that only one instance exists
if not cls.__instance:
cls.__instance = super(_NoValueType, cls).__new__(cls)
return cls.__instance
# needed for python 2 to preserve identity through a pickle
def __reduce__(self):
return (self.__class__, ())
def __repr__(self):
return "<no value>"
File: /usr/local/lib/python3.6/dist-packages/numpy/_globals.py
Type: type
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.