Open DavidCEllis opened 1 month ago
Thanks, that's an interesting case. Not immediately clear to me how we can fix this; it's not clear how to tell where the AttributeError came from. Maybe we should make static types return an empty dict in their __annotations__
descriptor instead of throwing AttributeError.
I was actually testing it to see if I'd get a _Stringifier
again or a ForwardRef
based on the other issue and was a bit surprised when I got nothing instead.
In the FORWARDREF format we try to return .__annotations__
first. If that succeeds, we're done. And in this case, it arguably does succeed.
If you directly access Example2.__annotations__
you get the AttributeError
though. The 'success' is entirely because this error is being silenced.
I'd expect VALUE
to raise this exception. I'd expect FORWARDREF
to either also error in this way or return a ForwardRef
for the (currently) invalid attribute.
Traceback (most recent call last):
File "/home/david/src/scratch/annotation_issue.py", line 34, in <module>
Example2.__annotations__
File "/home/david/src/scratch/annotation_issue.py", line 19, in __annotate__
fake_attribute: typing.DoesNotExist
^^^^^^^^^^^^^^^^^^^
File "/home/david/src/cpython/Lib/typing.py", line 3829, in __getattr__
raise AttributeError(f"module {__name__!r} has no attribute {attr!r}")
AttributeError: module 'typing' has no attribute 'DoesNotExist'
Bug report
Bug description:
If there's an annotation with an incorrect attribute access, the
AttributeError
causesget_annotations
to return an empty dictionary for the annotations instead of failing or returning aForwardRef
.Output
I think this is due to
_get_dunder_annotations
catchingAttributeError
and returning an empty dict, intended for static types but catching this by mistake.CPython versions tested on:
3.14
Operating systems tested on:
Linux