web-dev-qa-db-ja.com

NoneTypeはPython 3.xのどこにありますか?

Python 3)で、valueが文字列かNoneかを確認したいと思います。

これを行う1つの方法は

assert type(value) in { str, NoneType }

しかし、PythonのNoneTypeはどこにありますか?

インポートせずに、NoneTypeを使用するとNameError: name 'NoneType' is not definedが生成されます。

25
Tregoreg

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
32
Martijn Pieters

type(None)を使用してください。 python Shellを使用して、以下の関数のように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)
0
ZosionLee