Python 3)で、value
が文字列かNone
かを確認したいと思います。
これを行う1つの方法は
assert type(value) in { str, NoneType }
しかし、PythonのNoneType
はどこにありますか?
インポートせずに、NoneType
を使用するとNameError: name 'NoneType' is not defined
が生成されます。
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
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)