web-dev-qa-db-ja.com

オブジェクトがnamedtupleのインスタンスであるかどうかを確認するにはどうすればよいですか?

オブジェクトが 名前付きタプル のインスタンスであるかどうかを確認するにはどうすればよいですか?

39

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つではありません;-)。

40
Alex Martelli

オブジェクトが特定の名前付きタプルのインスタンスであるかどうかを確認する場合は、次のようにします。

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
23

名前付きtuple固有の関数を呼び出す前に確認する必要がある場合は、それらを呼び出して、代わりに例外をキャッチしてください。これは、Pythonでそれを行うための好ましい方法です。

4
Tor Valamo

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)                                  
3
jvdillon

私が使う

isinstance(x, Tuple) and isinstance(x.__dict__, collections.abc.Mapping)

これは、名前付きタプルの性質の辞書の側面を最もよく反映しているように見えます。考えられる将来の変更に対しても堅牢であるように見え、そのようなことが発生した場合は、多くのサードパーティの名前付きtuple-ishクラスでも機能する可能性があります。

1
Lutz Prechelt