Piet van Oostrum wrote: > Chris Angelico <ros...@gmail.com> writes: > >> I'm not sure what's going on here, and it's probably not actually >> enum-specific, but that's where I saw it. >> >> If you create a plain class and have an attribute with an annotation, >> you can see that: >> >>>>> class Foo: >> ... spam: "ham" = 1 >> ... >>>>> Foo.__a >> Foo.__abstractmethods__ Foo.__annotations__ >>>>> Foo.__annotations__ >> {'spam': 'ham'} > > Also strange: > > It shows Foo.__abstractmethods__ but there is no such attribute. > What's going on? > >>>> Foo.__abstractmethods__ > Traceback (most recent call last): > File "<stdin>", line 1, in <module> > AttributeError: __abstractmethods__
An AttributeError doesn't generally doesn't mean that the attribute doesn't exist. Consider: >>> class Foo: ... @property ... def bar(self): raise AttributeError ... >>> foo = Foo() >>> "bar" in dir(foo) True >>> foo.bar Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 3, in bar AttributeError So __abstractmethods__ might be a property of Foo's metaclass (type). Let's see: >>> type.__dict__["__abstractmethods__"] <attribute '__abstractmethods__' of 'type' objects> >>> type.__dict__["__abstractmethods__"].__get__(Foo) Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: __abstractmethods__ -- https://mail.python.org/mailman/listinfo/python-list