オブジェクトに何らかの属性があるかどうかを判断する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
を使用する方が、例外ブロックに繰り返し入るよりもおそらく高速になります。
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
をキャッチすることもできますが、属性の値がデフォルトでない場合は、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)を呼び出して例外をキャッチします。そのため、事前にhasattr()を使用するのと同じように、属性アクセスをtryステートメントでラップしてAttributeErrorをキャッチするのと同じくらい有効です。
a = SomeClass()
try:
return a.fake_prop
except AttributeError:
return default_value
これを避けることをお勧めします。
try:
doStuff(a.property)
except AttributeError:
otherStuff()
ユーザー@jpalecekはそれを述べました:AttributeError
name__がdoStuff()
の中にある場合、あなたは失われます。
たぶん、このアプローチはより良いです:
try:
val = a.property
except AttributeError:
otherStuff()
else:
doStuff(val)
状況に応じて、isinstance
でどんな種類のオブジェクトがあるのかを確認してから、対応する属性を使用できます。 Python 2.6/3.0で abstract base classes が導入されたことで、このアプローチもはるかに強力になりました(基本的にABCはより洗練されたアヒルタイピング方法を可能にします)。
2つの異なるオブジェクトが同じ名前を持つが異なる意味を持つ属性を持っている場合、これが役に立つという状況が1つあります。 hasattr
のみを使用すると、奇妙なエラーが発生する可能性があります。
良い例の1つは、イテレータとイテラブルの違いです( this questionを参照)。イテレータとイテラブルの__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
_ edit _ :この方法には重大な制限があります。オブジェクトが イテラブル 1であればうまくいきます。以下のコメントを確認してください。
私のように Python 3.6 またはそれ以上を使っているのであれば、オブジェクトが特定の属性を持っているかどうかを調べる便利な方法があります。
if 'attr1' in obj1:
print("attr1 = {}".format(obj1["attr1"]))
しかし、今のところどちらが最善のアプローチかはわかりません。 hasattr()
を使う、getattr()
を使う、またはin
を使う。コメントは大歓迎です。
これは非常に直感的なアプローチです。
if 'property' in dir(a):
a.property
別の可能なオプションですが、beforeで何を意味するかによって異なります。
undefined = object()
class Widget:
def __init__(self):
self.bar = 1
def zoom(self):
print("zoom!")
a = Widget()
bar = getattr(a, "bar", undefined)
if bar is not undefined:
print("bar:%s" % (bar))
foo = getattr(a, "foo", undefined)
if foo is not undefined:
print("foo:%s" % (foo))
zoom = getattr(a, "zoom", undefined)
if zoom is not undefined:
zoom()
出力:
bar:1
zoom!
これにより、値のない属性をチェックすることもできます。
しかし! undefined
は決して機能しないため、is
を複数の場所で誤ってインスタンス化して比較しないように注意してください。
object
組み込みメソッドを使用すると、hasattr
に属性が含まれているかどうかを確認できます。
たとえば、あなたのオブジェクトがa
で、属性stuff
を調べたい場合
>>> class a:
... stuff = "something"
...
>>> hasattr(a,'stuff')
True
>>> hasattr(a,'other_stuff')
False
メソッドシグネチャ自体はhasattr(object, name) -> bool
です。これはobject
がhasattr
の2番目の引数に渡される attribute を持つ場合、オブジェクト内のTrue
属性の存在に応じてブール値のFalse
またはname
を与えることを意味します。
これは非常に簡単です、dir(
を使うだけです物)
これはオブジェクトの利用可能なすべての関数と属性のリストを返します。