Разница между Нет и - PullRequest
       0

Разница между Нет и

1 голос
/ 10 февраля 2020

Я знаком с 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>? Я предполагаю, что это просто создание документации, когда нет определенного значения по умолчанию, но почему бы просто не перечислить значение по умолчанию вообще?

Ответы [ 2 ]

5 голосов
/ 10 февраля 2020

Это просто документация, такого понятия нет в Python самом .

Учтите, что None само по себе является также допустимым объектом . Иногда вы хотите принять None в качестве допустимого значения для аргумента, поэтому вы не можете использовать его в качестве значения по умолчанию для необязательного параметра. Вы не сможете различить guish между значением по умолчанию 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() output:

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

Наконец, None следует не сравнивать с null или nullptr. None - это объект-одиночка, на который можно ссылаться вместо другой объект. null и nullptr используются для сигнализации о отсутствии ссылки и могут передаваться как другие скалярные значения. Вы не можете сделать это в Python, когда Все это действительная ссылка на объект. (Самое большее, вы получите исключение NameError или UnboundLocal, если попытаетесь использовать имя, к которому еще не привязано его пространство имен).

0 голосов
/ 11 февраля 2020

Код для 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...