Як "перевірити" NoneType в python?


398

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

if not new:
    new = '#'

Я знаю, що це неправильний шлях, і сподіваюся, ви зрозуміли, що я мав на увазі.


Я думаю, що на це відповіли тут і, мабуть, десь раніше
йодмм

Якщо Noneєдине значення, яке ваш метод повертає, bool(returnValue)дорівнює False, то воно if not new:повинно працювати нормально. Це трапляється іноді у вбудованих libs - наприклад, re.matchповертає або None, або об'єкт truthy match.
Кевін

Також дивіться мою відповідь про nullі Noneв python тут .
Майкл Екока

Відповіді:


631

Тож як я можу поставити під сумнів змінну, яка є 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і завжди, слід проводити з isis notоператорами рівності або , ніколи .


То в чому різниця між == Noneі is None?
NoName

@NoName Що стосується None, вони обидва дадуть однаковий результат.
thefourtheye

1
це не працює, якщо порівнювати, чи pandasіснує DataFrame - для цього я type(df) is type(None)уникаю:The truth value of a DataFrame is ambiguous
Marc Maxmeister


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-statement:

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
Сантош Дхаіпуле Чандракант

@AaronHall Чому isinstance його не слід використовувати? Я розумію, що isслід віддати перевагу, але є деякі випадки, коли форма речовини є більш природною (наприклад, перевірка на кілька типів одночасно isinstance(x, (str, bool, int, type(None)))). Це лише особисті переваги чи є застереження, про яке я не знаю?
Конхілікультор

@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.
Аарон Холл

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")
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.