Merge pull request #8571 from tk0miya/8567_wrong_ivars_in_parent_class

Fix #8567: autodoc: Instance attributes are incorrectly added to Parent class
This commit is contained in:
Takeshi KOMIYA
2020-12-22 23:40:25 +09:00
committed by GitHub
3 changed files with 11 additions and 4 deletions

View File

@@ -19,6 +19,7 @@ Bugs fixed
* #8559: autodoc: AttributeError is raised when using forward-reference type * #8559: autodoc: AttributeError is raised when using forward-reference type
annotations annotations
* #8568: autodoc: TypeError is raised on checking slots attribute * #8568: autodoc: TypeError is raised on checking slots attribute
* #8567: autodoc: Instance attributes are incorrectly added to Parent class
Testing Testing
-------- --------

View File

@@ -1856,13 +1856,14 @@ class DataDocumenter(GenericAliasMixin, NewTypeMixin, TypeVarMixin,
def update_annotations(self, parent: Any) -> None: def update_annotations(self, parent: Any) -> None:
"""Update __annotations__ to support type_comment and so on.""" """Update __annotations__ to support type_comment and so on."""
try: try:
annotations = inspect.getannotations(parent) annotations = dict(inspect.getannotations(parent))
parent.__annotations__ = annotations
analyzer = ModuleAnalyzer.for_module(self.modname) analyzer = ModuleAnalyzer.for_module(self.modname)
analyzer.analyze() analyzer.analyze()
for (classname, attrname), annotation in analyzer.annotations.items(): for (classname, attrname), annotation in analyzer.annotations.items():
if classname == '' and attrname not in annotations: if classname == '' and attrname not in annotations:
annotations[attrname] = annotation # type: ignore annotations[attrname] = annotation
except AttributeError: except AttributeError:
pass pass
@@ -2292,7 +2293,8 @@ class AttributeDocumenter(GenericAliasMixin, NewTypeMixin, SlotsMixin, # type:
def update_annotations(self, parent: Any) -> None: def update_annotations(self, parent: Any) -> None:
"""Update __annotations__ to support type_comment and so on.""" """Update __annotations__ to support type_comment and so on."""
try: try:
annotations = inspect.getannotations(parent) annotations = dict(inspect.getannotations(parent))
parent.__annotations__ = annotations
for cls in inspect.getmro(parent): for cls in inspect.getmro(parent):
try: try:
@@ -2303,11 +2305,14 @@ class AttributeDocumenter(GenericAliasMixin, NewTypeMixin, SlotsMixin, # type:
analyzer.analyze() analyzer.analyze()
for (classname, attrname), annotation in analyzer.annotations.items(): for (classname, attrname), annotation in analyzer.annotations.items():
if classname == qualname and attrname not in annotations: if classname == qualname and attrname not in annotations:
annotations[attrname] = annotation # type: ignore annotations[attrname] = annotation
except (AttributeError, PycodeError): except (AttributeError, PycodeError):
pass pass
except AttributeError: except AttributeError:
pass pass
except TypeError:
# Failed to set __annotations__ (built-in, extensions, etc.)
pass
def import_object(self, raiseerror: bool = False) -> bool: def import_object(self, raiseerror: bool = False) -> bool:
try: try:

View File

@@ -690,6 +690,7 @@ def test_autodoc_special_members(app):
actual = do_autodoc(app, 'class', 'target.Class', options) actual = do_autodoc(app, 'class', 'target.Class', options)
assert list(filter(lambda l: '::' in l, actual)) == [ assert list(filter(lambda l: '::' in l, actual)) == [
'.. py:class:: Class(arg)', '.. py:class:: Class(arg)',
' .. py:attribute:: Class.__annotations__',
' .. py:attribute:: Class.__dict__', ' .. py:attribute:: Class.__dict__',
' .. py:method:: Class.__init__(arg)', ' .. py:method:: Class.__init__(arg)',
' .. py:attribute:: Class.__module__', ' .. py:attribute:: Class.__module__',