web-dev-qa-db-ja.com

なしPythonエラー/バグ?

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
_

私はこれをよりよく理解できるように詳細な説明を探しています

編集:良いアプリケーション

isinstancevariableを含むさまざまなタイプである場合に何かを実行できるように、Noneを使用したいとします。

_if isinstance(variable,(None,str,float)):
    #do something
_
20
Ryan Saxe

あなたが試すことができます:

_>>> variable = None
>>> isinstance(variable,type(None))
True
>>> variable = True
>>> isinstance(variable,type(None))
False
_

isinstance 2つの引数を取りますisinstance(object, classinfo)ここで、Noneを渡すことにより、classinfoをNoneに設定しているため、エラーが発生します。タイプを渡す必要があります。

31
karthikr

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))に置き換える傾向があることがよくあります。

23
arshajii

Nonetypes.NoneTypeの単なる値であり、タイプではありません。

そして、エラーは十分に明らかです:

TypeError:isinstance()arg 2はclasstype、またはclassesおよびtypesのタプル

docs から:

Noneは、types.NoneTypeの唯一のです。 Noneは、デフォルトの引数が関数に渡されない場合のように、値がないことを表すために頻繁に使用されます。

types.NoneTypeを使用できます

>>> from types import NoneType
>>> isinstance(None, NoneType)
True

is演算子も正常に機能します:

>>> a = None
>>> a is None
True
4

Noneは値(インスタンス)であり、タイプではありません。エラーメッセージが示すように、isinstanceは2番目の引数が型であることを期待しています。

Noneのタイプはtype(None)、またはインポートする場合はNonetypeです(from types import NoneType

注:テストを行う慣用的な方法はvariable is Noneです。短くて説明的。

3
Karoly Horvath