Pythonには、None
シングルトンがあります。これは、特定の状況ではかなり奇妙に動作します。
_>>> a = None
>>> type(a)
<type 'NoneType'>
>>> isinstance(a,None)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: isinstance() arg 2 must be a class, type, or Tuple of classes and types
_
したがって、最初に、_<type 'NoneType'>
_は、None
は型ではなく、NoneType
は型であることを示します。ただし、isinstance(a,NoneType)
を実行すると、次のエラーで応答します:_NameError: name 'NoneType' is not defined
_
さて、これを考えると、入力のデフォルトがNone
に設定されている関数があり、チェックする必要がある場合は、次のようにします。
_if variable is None:
#do something
else:
#do something
_
代わりに次のことができない理由は何ですか。
_if isinstance(variable,None): #or NoneType
#do something
else:
#do something
_
私はこれをよりよく理解できるように詳細な説明を探しています
編集:良いアプリケーション
isinstance
がvariable
を含むさまざまなタイプである場合に何かを実行できるように、None
を使用したいとします。
_if isinstance(variable,(None,str,float)):
#do something
_
あなたが試すことができます:
_>>> variable = None
>>> isinstance(variable,type(None))
True
>>> variable = True
>>> isinstance(variable,type(None))
False
_
isinstance 2つの引数を取りますisinstance(object, classinfo)
ここで、None
を渡すことにより、classinfo
をNoneに設定しているため、エラーが発生します。タイプを渡す必要があります。
None
は型ではなく、シングルトンインスタンス自体です-そして isinstance
の2番目の引数は、それらの型、クラス、またはタプルでなければなりません。したがって、 NoneType
からtypes
を使用する必要があります。
_from types import NoneType
print isinstance(None, NoneType)
print isinstance(None, (NoneType, str, float))
_
True True
ただし、isinstance(x, (NoneType, str, float))
をx is None or isinstance(x, (str, float))
に置き換える傾向があることがよくあります。
None
はtypes.NoneType
の単なる値であり、タイプではありません。
そして、エラーは十分に明らかです:
TypeError:isinstance()arg 2はclass、type、またはclassesおよびtypesのタプル
docs から:
None
は、types.NoneType
の唯一の値です。None
は、デフォルトの引数が関数に渡されない場合のように、値がないことを表すために頻繁に使用されます。
types.NoneType
を使用できます
>>> from types import NoneType
>>> isinstance(None, NoneType)
True
is
演算子も正常に機能します:
>>> a = None
>>> a is None
True
None
は値(インスタンス)であり、タイプではありません。エラーメッセージが示すように、isinstance
は2番目の引数が型であることを期待しています。
Noneのタイプはtype(None)
、またはインポートする場合はNonetype
です(from types import NoneType
)
注:テストを行う慣用的な方法はvariable is None
です。短くて説明的。