Pythonでオブジェクトに属性があるかどうかを知る方法
-
03-07-2019 - |
質問
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 )
を使用するだけです
これにより、オブジェクトの使用可能なすべての関数と属性のリストが返されます。