3

bar次のクラス (バグのあるプロパティを持つ) が与えられた場合、プロパティが存在することを確認する最も簡単な方法は何ですか?

class Foo(object):
    @property
    def bar(self):
        raise AttributeError('unforeseen attribute error!')

両方ともhasattr失敗getattrし、機能するだけdirです:

foo = Foo()

print hasattr(foo, 'bar')
# False

try:
    getattr(foo, 'bar')
    print True
except AttributeError as e:
    print False
# False    

print 'bar' in dir(foo)
# True

私が考えることができる最善の総合的な解決策は次のとおりです。

def robust_hasattr(obj, attr):
    return hasattr(obj, attr) or attr in dir(obj)

より良い方法はありますか?

4

2 に答える 2

7

バグのあるプロパティがある場合は、バグを修正します。レイズAttributeErrorがバグである場合は、プロパティがそれを行わないようにします。その例外を発生させることはその属性を使用してはならないことを知らせる方法です。

を使用dir()すると回避策になる可能性がありますが、情報を省略でき、フックによってオーバーライドできるデバッグ支援と同様に、絶対確実ではありません(コードにバグを導入する別のベクトルを与えます)。次に、バグのあるフックバグのあるフック、さらにはメタクラスの記述子の可能性がありますが、これらはすべて を使用しても検出できません。dir()object.__dir__object.__getattr__object.__getattribute__dir()

特にプロパティを探しているので、オブジェクトのクラスで同じ属性を探します。

hasattr(foo, 'bar') or isinstance(getattr(type(foo), 'bar', None), property)

特定のケースでは、上記は True を返します。

>>> class Foo(object):
...     @property
...     def bar(self):
...         raise AttributeError('unforeseen attribute error!')
...
>>> foo = Foo()
>>> hasattr(foo, 'bar') or isinstance(getattr(type(foo), 'bar', None), property)
True

クラスには実際にそのようなpropertyオブジェクトがあるためです。

于 2016-05-19T08:22:44.723 に答える
3

Python の規則により、bar属性は存在しません。属性にアクセスしようとしても例外が発生しない場合、オブジェクトは属性を持っていると見なされます。

属性が存在するかどうかについて別の概念を使用したい場合は、その概念を自分で実装できます。たとえばbar、インスタンス dict またはクラス dict の 1 つに対応するエントリの存在を確認するには、次のようにします。

for obj in (foo,) + type(foo).__mro__:
    if 'bar' in obj.__dict__:
        print "It's there."
        break
else:
    print "Didn't find it."
于 2016-05-19T08:23:07.907 に答える