Как «проверить» NoneType в python?

398

У меня есть метод, который иногда возвращает значение NoneType. Так, как я могу подвергнуть сомнению переменную, которая является NoneType? Мне нужно использовать , если метод, например ,

if not new:
    new = '#'

Я знаю, что это неправильный путь, и я надеюсь, что вы понимаете, что я имел в виду.

CrveniZg
источник
Я думаю, что на это ответили здесь и, видимо, где-то раньше
yorodm
Если Noneэто единственное значение, которое возвращает ваш метод, для которого bool(returnValue)равно False, то if not new:должно работать нормально. Это иногда происходит во встроенных библиотеках - например, re.matchвозвращает None или объект истинного соответствия.
Кевин
Также см. Мой ответ о nullи Noneв Python здесь .
Майкл Экока

Ответы:

632

Так, как я могу подвергнуть сомнению переменную, которая является NoneType?

Используйте isоператор, как это

if variable is None:

Почему это работает?

Так Noneкак это единственный синглтон объект NoneTypeв Python, мы можем использовать isоператор, чтобы проверить, есть ли переменная Noneв нем или нет.

Цитирование из isдокументов ,

Операторы isиis not тест для идентификации объекта: x is yистинно тогда и только тогда, когда xи yявляются одним и тем же объектом. x is not yдает обратное значение истины.

Поскольку может быть только один экземпляр None , isбудет предпочтительным способом проверки None.


Услышь это изо рта лошади

Цитирование Руководства по стилю кодирования Python - PEP-008 (совместно определенное самим Гвидо),

Сравнения с синглетонами, такими как Noneвсегда, должны выполняться с isили is notникогда , а не с операторами равенства .

thefourtheye
источник
Так в чем разница между == Noneи is None?
NoName
@NoName Что касается None, они оба дадут похожий результат.
thefourtheye
2
это не работает, если сравнивать, pandasсуществует ли DataFrame - для этого я использую, type(df) is type(None)чтобы избежать:The truth value of a DataFrame is ambiguous
Марк Максмейстер
74
if variable is None:
   ...

if variable is not None:
   ...
elhoucine
источник
27

Она также может быть сделано с isinstanceсогласно ответу Алекса Холла :

>>> NoneType = type(None)
>>> x = None
>>> type(x) == NoneType
True
>>> isinstance(x, NoneType)
True

isinstance также интуитивно понятен, но есть сложность, которая требует линии

NoneType = type(None)

который не нужен для таких типов, как intи float.

кардамон
источник
Поскольку вы не можете создавать подклассы NoneTypeи, поскольку он Noneявляется единичным, isinstanceего не следует использовать для обнаружения None- вместо этого вы должны делать то, что говорит принятый ответ, и использовать is Noneили is not None.
Аарон Холл
18

Как указано в комментарии Аарона Холла:

Поскольку вы не можете создавать подклассы NoneTypeи, поскольку он Noneявляется единичным, isinstanceего не следует использовать для обнаружения None- вместо этого вы должны делать то, что говорит принятый ответ, и использовать is Noneили is not None.


Оригинальный ответ:

Самый простой способ, однако, без дополнительной строки в дополнение к ответу кардамона, вероятно:
isinstance(x, type(None))

Так, как я могу подвергнуть сомнению переменную, которая является NoneType? Мне нужно использовать если метод

Использование isinstance()не требует isвнутри- ifсостояния:

if isinstance(x, type(None)): 
    #do stuff

Дополнительная информация
Вы также можете проверить наличие нескольких типов в одном isinstance()операторе, как указано в документации . Просто напишите типы в виде кортежа.

isinstance(x, (type(None), bytes))
Мартин Мюсли
источник
1
Поскольку вы не можете создавать подклассы NoneTypeи, поскольку он Noneявляется единичным, isinstanceего не следует использовать для обнаружения None- вместо этого вы должны делать то, что говорит принятый ответ, и использовать is Noneили is not None.
Аарон Холл
1
Этот ответ был полезен дляpython 3.6.7
Santhosh Dhaipule Chandrakanth
@AaronHall Почему isinstance не следует использовать? Я понимаю, что это isдолжно быть предпочтительным, но в некоторых случаях форма isinstance выглядит более естественной (например, проверка нескольких типов одновременно isinstance(x, (str, bool, int, type(None)))). Это просто личное предпочтение или есть предостережение, о котором я не знаю?
Conchylicultor
@Conchylicultor обратная сторона вашего предложения: 1. глобальный поиск type2. затем вызов его 3. затем поиск типа None- когда Noneэто и одиночный, и ключевое слово. Еще один недостаток: 4. это очень нестандартно и вызывает удивление, когда люди смотрят на ваш код. x is Noneэто более оптимизированная проверка. Я бы предложил x is None or isinstance(x, (str, bool, int))- но я бы также посоветовал вам больше думать о том, что вы делаете, когда выполняете такого рода проверку типов для типов, которые не имеют много общего ...
Аарон Холл
4

Не уверен, что это отвечает на вопрос. Но я знаю, что мне понадобилось время, чтобы понять. Я просматривал веб-сайт, и вдруг имена авторов уже не было. Так что нужно проверить заявление.

if type(author) == type(None):
     my if body
else:
    my else body

Автор может быть любой переменной в этом случае, и Noneможет быть любым типом, который вы проверяете.

Джошуа Пачнер
источник
Поскольку Noneэто одноэлементный объект, typeего не следует использовать для обнаружения None- вместо этого следует делать, как говорится в принятом ответе, и использовать is Noneили is not None.
Aaron Hall
2

Python 2.7:

x = None
isinstance(x, type(None))

или

isinstance(None, type(None))

==> Правда

Пешко
источник
1
Поскольку вы не можете создавать подклассы NoneTypeи, поскольку он Noneявляется единичным, isinstanceего не следует использовать для обнаружения None- вместо этого вы должны делать то, что говорит принятый ответ, и использовать is Noneили is not None.
Аарон Холл
О, хорошо! Спасибо !
Песко
0

Надеюсь этот пример будет вам полезен)

print(type(None) # NoneType

Итак, вы можете проверить тип имени переменной

#Example
name = 12 # name = None
if type(name) != type(None):
    print(name)
else:
    print("Can't find name")
alexmosk25
источник