オブジェクトが 名前付きタプル のインスタンスであるかどうかを確認するにはどうすればよいですか?
functioncollections.namedtuple
を呼び出すと、メンバーを持つTuple
のサブクラスである(他のクラスはない)新しい型が得られます_fields
という名前で、アイテムがすべて文字列であるタプルです。したがって、これらのすべてをチェックすることができます。
def isnamedtupleinstance(x):
t = type(x)
b = t.__bases__
if len(b) != 1 or b[0] != Tuple: return False
f = getattr(t, '_fields', None)
if not isinstance(f, Tuple): return False
return all(type(n)==str for n in f)
ISこれから誤検知を取得することは可能ですが、誰かがlotのようなタイプを作成するために邪魔をしている場合に限ります名前付きタプルですが、1つではありません;-)。
オブジェクトが特定の名前付きタプルのインスタンスであるかどうかを確認する場合は、次のようにします。
from collections import namedtuple
SomeThing = namedtuple('SomeThing', 'prop another_prop')
SomeOtherThing = namedtuple('SomeOtherThing', 'prop still_another_prop')
a = SomeThing(1, 2)
isinstance(a, SomeThing) # True
isinstance(a, SomeOtherThing) # False
名前付きtuple固有の関数を呼び出す前に確認する必要がある場合は、それらを呼び出して、代わりに例外をキャッチしてください。これは、Pythonでそれを行うための好ましい方法です。
Lutzが投稿した内容の改善:
def isinstance_namedtuple(x):
return (isinstance(x, Tuple) and
isinstance(getattr(x, '__dict__', None), collections.Mapping) and
getattr(x, '_fields', None) is not None)
私が使う
isinstance(x, Tuple) and isinstance(x.__dict__, collections.abc.Mapping)
これは、名前付きタプルの性質の辞書の側面を最もよく反映しているように見えます。考えられる将来の変更に対しても堅牢であるように見え、そのようなことが発生した場合は、多くのサードパーティの名前付きtuple-ishクラスでも機能する可能性があります。