web-dev-qa-db-ja.com

Python isinstanceがリストにあるタイプかどうかを確認しますか?

どうすればPythonのようにできますか:

var = 7.0
var_is_good = isinstance(var, classinfo1) or isinstance(var, classinfo2) or isinstance(var, classinfo3) or ... or  isinstance(var, classinfoN)

Classinfoのリストを渡すことはできません。

var_is_good = isinstanceofany( var, [classinfo1, classinfo2, ... , classinfoN] )

isinstanceofany関数とは何ですか?

49
D Adams

isinstance()は、2番目の引数のクラスのTupleを取ります。最初の引数がそのシーケンス内の型のanyのインスタンスである場合、trueを返します。

_isinstance(var, (classinfo1, classinfo2, classinfo3))
_

つまり、isinstance()alreadyは、この機能をすぐに使用できます。

isinstance() documentation から:

classinfoがクラスオブジェクトでも型オブジェクトでもない場合、クラスまたは型オブジェクトのタプルであるか、再帰的に他のオブジェクトを含む可能性がありますタプル(他のシーケンスタイプは受け入れられません)

重点鉱山;再帰的な性質に注意してください。 _(classinfo1, (classinfo2, classinfo3))_も有効なオプションです。

107
Martijn Pieters

あなたはすでにあなたの質問のタイトルにかなり近づいていました。 any とリストを使用できます。

var = 7.0
var_is_good = any([isinstance(var, classinfo1),
                   isinstance(var, classinfo2),
                   isinstance(var, classinfo3), ...
                   isinstance(var, classinfoN)])

しかし、 isinstance のドキュメントを見ると明らかになります:

オブジェクト引数がclassinfo引数のインスタンス、またはその(直接、間接、または仮想)サブクラスのインスタンスである場合、trueを返します。 objectが指定されたタイプのオブジェクトではない場合、関数は常にfalseを返します。 classinfoがクラス(タイプオブジェクト)でない場合、それはタイプオブジェクトのタプルであるか、または他のそのようなタプルを再帰的に含む可能性があります(他のシーケンスタイプは受け入れられません)。 classinfoが型または型のタプルとそのようなタプルでない場合、TypeError例外が発生します。

これは、それを行うためのより良い方法であることを意味します

var = 7.0
var_is_good = isinstance(var, (classinfo1,
                               classinfo2,
                               classinfo3,
                               ...,
                               classinfoN))
6
Martin Thoma

これで問題が解決します:

valid_instance_types = <Tuple of types you want to allow>
var_is_good = isinstance(var, valid_instance_types)

ドキュメント に基づいて、タイプの値をisinstanceに渡すことができる多くの方法があります。

また、これが単なる一部であるより複雑な検証を行おうとしている場合は、 voluptuous を調べることもできます。

4
Nathaniel Ford

通常はisinstanceを使用するべきではありませんが、したいことは any() 組み込み関数で実現できます。

var_is_good = any(isinstance(var, t) for t in [type1, type2, type3])
3
Chad S.