Где находится 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)