質問

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 を持っているかどうかを使用前に確認するにはどうすればよいですか?

役に立ちましたか?

解決

hasattr() を試してください。

if hasattr(a, 'property'):
    a.property

編集:以下の zweiterlindeの回答をご覧ください。非常に素晴らしいアプローチ!

Pythonの一般的な慣習は、プロパティがほとんどの時間そこにある可能性が高い場合、単にそれを呼び出して例外を伝播させるか、try / exceptブロックでトラップすることです。これはおそらく hasattr よりも高速です。プロパティがほとんどの時間に存在しない可能性が高い場合、または不明な場合は、 hasattr を使用すると、例外ブロックに繰り返し落ちるよりもおそらく高速になります。

他のヒント

As ジャレットハーディが答え、 hasattr がトリックを行います。ただし、Pythonコミュニティの多くが「許可よりも許しを求める方が簡単」という戦略を推奨していることを付け加えます。 (EAFP)「飛ぶ前に見る」ではなく、 (LBYL)。これらの参照を参照してください:

EAFP対LBYL(Re:これまでは少しがっかりしていました)
EAFP vs. LBYL @Code like a Pythonista:Idiomatic Python

ie:

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

...の推奨:

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

hasattr()を使用するか、 AttributeError をキャッチできますが、属性の値が存在しない場合にデフォルトで必要な場合は、オプションは、単に getattr() を使用することです。

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

探しているのは 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
警告:
私が推奨する理由は、hasattrがプロパティを検出しないからです。
リンク: http://mail.python.org/pipermail/python -dev / 2005-December / 058498.html

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

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

これを避けることを提案したい:

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

ユーザー@jpalecekからの言及: doStuff()内で AttributeError が発生すると、あなたは失われます。

このアプローチの方が良いかもしれません:

try:
    val = a.property
except AttributeError:
    otherStuff()
else:
    doStuff(val)

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

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

良い例の1つは、イテレータとイテラブルの違いです( this の質問)。イテレータとイテラブルの __ iter __ メソッドは同じ名前ですが、意味的にはまったく異なります!したがって、 hasattr は役に立たないが、 isinstance とABCの組み合わせはクリーンなソリューションを提供する。

ただし、ほとんどの場合、 hasattr アプローチ(他の回答で説明)が最も適切なソリューションであることに同意します。

hasattr()を期待しているが、hasattr()を避け、getattr()を好むようにしてください。 getattr()はhasattr()よりも高速です

hasattr()の使用:

 if hasattr(a, 'property'):
     print a.property

ここでも同じです。getattrを使用して、プロパティがない場合にプロパティを取得します

   property = getattr(a,"property",None)
    if property:
        print property

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

私のように Python 3.6 以上を使用している場合、オブジェクトに特定の属性があるかどうかを確認する便利な代替手段があります:

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

ただし、現時点でどちらが最善のアプローチかはわかりません。 hasattr()の使用、 getattr()の使用、または in の使用。コメントは大歓迎です。

これは非常に直感的なアプローチです。

if 'property' in dir(a):
    a.property

hasattr 組み込みメソッドを使用して、 object に属性が含まれているかどうかを確認できます。

オブジェクトが a で、属性 stuff

を確認する場合のインスタンス
>>> class a:
...     stuff = "something"
... 
>>> hasattr(a,'stuff')
True
>>> hasattr(a,'other_stuff')
False

メソッドシグネチャ自体は hasattr(object、name)-&gt;です。 bool は、 object attribute があり、 hasattr の2番目の引数に渡される場合、ブール型の True name 属性の存在に応じて、code>または False

これは非常に単純で、 dir( object を使用するだけです
これにより、オブジェクトの使用可能なすべての関数と属性のリストが返されます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top