Подтвердить что ты не робот

Нет Ошибка/ошибка Python?

В Python у вас есть синглтон None, который действует довольно странно в определенных обстоятельствах:

>>> a = None
>>> type(a)
<type 'NoneType'>
>>> isinstance(a,None)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: isinstance() arg 2 must be a class, type, or tuple of classes and types

Итак, <type 'NoneType'> показывает, что None не является типом, но это NoneType. Однако, когда вы запускаете isinstance(a,NoneType), он отвечает на ошибку: NameError: name 'NoneType' is not defined

Теперь, учитывая это, если у вас есть функция с введенным значением по умолчанию, установленным на None, и вам нужно проверить, вы бы сделали следующее:

if variable is None:
    #do something
else:
    #do something

В чем причина, по которой я не могу сделать следующее:

if isinstance(variable,None): #or NoneType
    #do something
else:
    #do something

Я просто ищу подробное объяснение, чтобы лучше понять это.

Изменить: хорошее приложение

Скажем, я хотел использовать isinstance, чтобы я мог что-то сделать, если variable - это множество типов, включая None:

if isinstance(variable,(None,str,float)):
    #do something
4b9b3361

Ответ 1

Вы можете попробовать:

>>> variable = None
>>> isinstance(variable,type(None))
True
>>> variable = True
>>> isinstance(variable,type(None))
False

isinstance принимает 2 аргумента isinstance(object, classinfo) Здесь, передавая None, вы устанавливаете classinfo на None, следовательно, ошибка, Вам нужно пройти в типе.

Ответ 2

None не является типом, это сам экземпляр singleton, а второй аргумент isinstance должен быть типом, класса или кортежа из них. Следовательно, вам нужно использовать NoneType из types.

from types import NoneType
print isinstance(None, NoneType)
print isinstance(None, (NoneType, str, float))
True
True

Хотя, я бы часто был склонен заменить isinstance(x, (NoneType, str, float)) на x is None or isinstance(x, (str, float)).

Ответ 3

None - это просто значение types.NoneType, это не тип.

И ошибка достаточно ясна:

TypeError: isinstance() arg 2 должен быть class, type или кортежем классы и типы

Из docs:

None является единственным значением types.NoneType. None часто используется для представления отсутствие значения, так как аргументы по умолчанию не передаются функция.

Вы можете использовать types.NoneType

>>> from types import NoneType
>>> isinstance(None, NoneType)
True
Оператор

is также отлично работает:

>>> a = None
>>> a is None
True

Ответ 4

None - это значение (экземпляр), а не тип. Как видно из сообщения об ошибке, isinstance ожидает, что второй аргумент будет типом.

Тип None: type(None) или Nonetype, если вы импортируете его (from types import NoneType)

Примечание. Идиоматический способ проведения теста - variable is None. Короткий и описательный.