Это просто документация, такого понятия нет в 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
, если попытаетесь использовать имя, к которому еще не привязано его пространство имен).