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`