Нет Ошибка/ошибка 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
Ответы
Ответ 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
. Короткий и описательный.