Karthikeyan Singaravelan <[email protected]> added the comment:
I am not sure this is a problem with dataclasses. dataclasses acts upon
information from cls.__dict__.get('__annotations__', {}) at [0] and sets the
type attribute for the field. Seems like using a valid identifier (class or
function) used as class attribute along with defining it as optional type of
the same name sets None type in annotation. Also happens when a class attribute
is used with optional type for another attribute as in Spam class This more
feels like a behavior with typing module. I am adding typing module maintainers
for clarification.
# bpo36363.py
import typing
class Baz:
pass
class Bar:
pass
class Foo:
baz: typing.Optional[Bar] = None
Bar: typing.Optional[Bar] = None
class Spam:
bar: typing.Optional[Bar] = None
baz: typing.Optional[bar] = None
print(Foo.__dict__.get('__annotations__', {}))
print(Spam.__dict__.get('__annotations__', {}))
$ ./python.exe ../backups/bpo36363.py
{'baz': typing.Union[__main__.Bar, NoneType], 'Bar': <class 'NoneType'>}
{'bar': typing.Union[__main__.Bar, NoneType], 'baz': <class 'NoneType'>}
[0]
https://github.com/python/cpython/blob/dcf617152e1d4c4a5e7965733928858a9c0936ca/Lib/dataclasses.py#L828
----------
nosy: +gvanrossum, levkivskyi, xtreak
versions: +Python 3.8
_______________________________________
Python tracker <[email protected]>
<https://bugs.python.org/issue36363>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe:
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com