簡體   English   中英

None 和 None 之間的區別<no value>

[英]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不應與比較nullnullptr None是單例對象,可以引用而不是另一個對象。 nullnullptr用於表示沒有引用,並且可以像其他標量值一樣傳遞。 你不能在 Python 中做到這一點,在 Python 中,一切都是對對象的有效引用。 (如果您嘗試使用名稱空間中尚未綁定的名稱,則最多會出現NameErrorUnboundLocal異常)。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM