20

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場合に何かを実行できるように使用したいとしましょう。variableNone

if isinstance(variable,(None,str,float)):
    #do something
4

4 に答える 4

32

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

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

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

于 2013-06-19T18:20:45.217 に答える
24

Noneは型ではなく、シングルトン インスタンスそのものです。 の 2 番目の引数はisinstance、それらの型、クラス、またはタプルでなければなりません。NoneTypeしたがって、 fromを使用する必要がありますtypes

from types import NoneType
print isinstance(None, NoneType)
print isinstance(None, (NoneType, str, float))
真実
真実

isinstance(x, (NoneType, str, float))とはいえ、私はしばしばx is None or isinstance(x, (str, float)).

于 2013-06-19T18:20:45.840 に答える
4

Noneの単なる値でありtypes.NoneType、型ではありません。

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

TypeError: isinstance() arg 2 はclasstype 、またはクラスのタプルで なければなりません

ドキュメントから:

Noneの唯一のですtypes.NoneTypeNoneデフォルトの引数が関数に渡されない場合など、値が存在しないことを表すためによく使用されます。

使用できますtypes.NoneType

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

is演算子も正常に動作します:

>>> a = None
>>> a is None
True
于 2013-06-19T18:20:02.933 に答える
3

None型ではなく、値 (インスタンス) です。エラー メッセージが示すように、isinstanceは 2 番目の引数が型であると想定しています。

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

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

于 2013-06-19T18:23:37.113 に答える