追加 - python 関数 属性




Pythonでオブジェクトに属性があるかどうかを調べる方法 (6)

pydocによると、hasattr(obj、prop)は単にgetattr(obj、prop)を呼び出し、例外をキャッチします。 したがって、属性アクセスをtryステートメントでラップしてAttributeErrorをキャッチし、hasattr()を事前に使用するのと同じように有効です。

a = SomeClass()
try:
    return a.fake_prop
except AttributeError:
    return default_value

オブジェクトに何らかの属性があるかどうかを判断するPythonの方法はありますか? 例えば:

>>> a = SomeClass()
>>> a.someProperty = value
>>> a.property
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: SomeClass instance has no attribute 'property'

それを使用する前にaが属性property持っているかどうかをどうやって調べることができますか?


Jarret Hardieが答えると、 hasattrはそのトリックを行います。 しかし、私は、Pythonコミュニティの多くが「あなたが飛躍する前に見てください」(LBYL)ではなく、「許諾よりも許諾を求めるのが簡単です(EAFP)」という戦略を推奨しています。 次の参照を参照してください。

EAFP対LBYL(Re:少し残念ながら)
EAFP対LBYL @コードはPythonistaのように:慣用Python

すなわち:

try:
    doStuff(a.property)
except AttributeError:
    otherStuff()

...より優先される:

if hasattr(a, 'property'):
    doStuff(a.property)
else:
    otherStuff()

hasattr()を使うか、 AttributeErrorキャッチすることができますが、デフォルトで属性の値が必要な場合は、 hasattr()を使うだけです。

getattr(a, 'property', 'default value')

編集 :このアプローチは深刻な制限があります。 オブジェクトが反復可能なものであれば動作するはずです。 以下のコメントを確認してください。

私のようなPython 3.6以降を使用している場合は、オブジェクトに特定の属性があるかどうかを確認する便利な方法があります。

if 'attr1' in obj1:
    print("attr1 = {}".format(obj1["attr1"]))

しかし、私はどちらが現在最善のアプローチであるかはわかりません。 hasattr()を使用するか、 hasattr()を使用するか、 inを使用inます。 コメントは大歓迎です。


状況によっては、オブジェクトの種類をisinstance確認してから、対応する属性を使用することができます。 Python 2.6 / 3.0に抽象基底クラスを導入することで、このアプローチはもっと強力になりました(基本的にABCはより洗練されたアヒルタイピングを可能にします)。

1つの状況は、2つの異なるオブジェクトが同じ名前の属性を持っていても意味が異なる場合に便利です。 hasattrだけを使用すると、奇妙なエラーが発生する可能性があります。

1つの良い例は、イテレータとiterableの区別です( this質問を参照)。 イテレータとiterableの__iter__メソッドは同じ名前ですが、意味的には全く異なります! だからhasattrは役に立たないが、ABCと一緒にhasattrはきれいなソリューションを提供する。

しかし、私はほとんどの状況でhasattrアプローチ(他の回答に記載)が最も適切な解決策であることに同意します。


私はあなたが探しているものはhasattrだと思います。 しかし、私はPythonのプロパティを検出したい場合は、このようなものをお勧めします -

try:
    getattr(someObject, 'someProperty')         
except AttributeError:
    print "Doesn't exist"
else
    print "Exists"

ここでの欠点は、プロパティ__get__コードの属性エラーも捕捉されることです。

それ以外の場合は、

if hasattr(someObject, 'someProp'):
    #Access someProp/ set someProp
    pass

ドキュメント: http://docs.python.org/library/functions.html : http://docs.python.org/library/functions.html
警告:
私の推薦の理由はhasattrがプロパティを検出しないということです。
リンク: http://mail.python.org/pipermail/python-dev/2005-December/058498.html : http://mail.python.org/pipermail/python-dev/2005-December/058498.html





attributes