2014-02-11 2 views
12

В Python 3, я хотел бы проверить, является ли value либо строкой, либо None.Где находится NoneType, расположенный в Python 3.x?

Один из способов сделать это

assert type(value) in { str, NoneType } 

Но где NoneType находится в Python?

Без импорта, используя NoneTypeNameError: name 'NoneType' is not defined.

+2

Вы также должны использовать 'isinstance'. Для проверки может потребоваться кортеж типов. 'isinstance (value, (str, type (None)))' –

+1

Если это не для модульного тестирования, можно утверждать, что вы обычно не должны вводить проверку вообще. –

+0

@rmartinjak: некоторые программисты все еще предпочитают утверждать свои предположения о кодировании с помощью инструкции 'assert'. Поддержка есть. * I * не будет использовать утверждения и также будет использовать модульное тестирование, но если вы используете 'assert' в любом случае .. –

ответ

17

Вы можете использовать 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 
+0

Я знаю об этом, но только из любопытства, это единственный способ получить «NoneType»? – Tregoreg

+0

@Tregoreg: Он нигде не отображается. –

+2

Не существует 'types.NoneType' из модуля' types', как это было в 2.X? –

Смежные вопросы