Где находится NoneType, расположенный в Python 3.x?
В Python 3 я хотел бы проверить, есть ли value
строка или None
.
Один из способов сделать это -
assert type(value) in { str, NoneType }
Но где NoneType
находится в Python?
Без какого-либо импорта использование NoneType
создает NameError: name 'NoneType' is not defined
.
Ответы
Ответ 1
Вы можете использовать type(None)
для получения объекта типа, но вы хотите использовать isinstance()
здесь, а не type() in {...}
:
assert isinstance(value, (str, type(None)))
Объект NoneType
иначе не отображается.
Я бы не использовал проверку типов для этого вообще, я бы использовал:
assert value is None or isinstance(value, str)
как None
является одноэлементным (очень специально), а NoneType
явно запрещает подклассификацию:
>>> type(None)() is None
True
>>> class NoneSubclass(type(None)):
... pass
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: type 'NoneType' is not an acceptable base type
Ответ 2
Пожалуйста, используйте type(None)
. Вы можете использовать оболочку python для проверки, как в приведенной ниже функции, в которой я использую type(None)
, чтобы перейти от None
к NoneType
.
def to_unicode(value):
'''change value to unicode'''
try:
if isinstance(value, (str,type(None))):
return value
if not isinstance(value, bytes):
raise TypeError("Expected bytes, unicode, or None; got %r" % type(value))
return value.decode("utf-8")
except UnicodeDecodeError:
return repr(value)