python - بيثون's هاستر أحيانا ترجع نتائج غير صحيحة



properties attributes (1)

تنفيذ python2 من هاساتر ساذجة إلى حد ما، فإنه يحاول فقط للوصول إلى تلك السمة ومعرفة ما إذا كان يثير استثناء أم لا.

لسوء الحظ، وهذا يعني أن أي استثناءات لم تتم معالجتها داخل خصائص سيتم ابتلاع، والأخطاء في هذا الرمز يمكن أن تضيع. لإضافة إهانة للإصابة، عندما هاتاتر يأكل الاستثناء، فإنه سيعود أيضا إجابة غير صحيحة (هنا السمة a.foo موجود، وبالتالي فإن النتيجة يجب أن يكون عاد True إذا كان أي شيء).

في python3.2 +، تم تصحيح السلوك:

hasattr(object, name)

الحجج هي كائن وسلسلة. والنتيجة هي True اذا كانت السلسلة هي اسم أحد سمات الكائن، False اذا لم تكن. (يتم تنفيذ هذا عن طريق استدعاء getattr(object, name) ورؤية ما إذا كان يثير getattr(object, name) أم لا.)

الإصلاح هنا ، ولكن للأسف هذا التغيير لم باكبورت.

إذا كان السلوك python2 يسبب المتاعب بالنسبة لك، والنظر في تجنب استخدام hasattr . بدلا من ذلك يمكنك استخدام محاولة / باستثناء حوالي getattr ، اصطياد فقط استثناء AttributeError والسماح لأي الآخرين رفع دون معالجة.

لماذا يقول hasattr أن المثيل ليس له سمة foo ؟

>>> class A(object):
...     @property
...     def foo(self):
...         ErrorErrorError
... 
>>> a = A()
>>> hasattr(a, 'foo')
False

توقعت:

>>> hasattr(a, 'foo')
NameError: name 'ErrorErrorError' is not defined`




hasattr