You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
classMyClass:
"An instance of this class holds a list.\n\n:param r: the list as a string"l: listdef__init__(self,r:str): self.l=list(r)
produces the following doc, as expected:
An instance of this class holds a list.
Parameters * r (str): the list as a string
Now, if I just change the name of the class attribute (and name it the same as the parameter), then Sphinx gets confused.
classMyClass:
"An instance of this class holds a list.\n\n:param r: the list as a string"r: listdef__init__(self,r:str): self.r=list(r)
produces the following doc, where the parameter is shown as having the type of the attribute with same name:
An instance of this class holds a list.
Parameters * r (list): the list as a string
Having a class attribute and a constructor parameter with the same name but not exactly the same type is quite common. For example, the parameter could be of type Optional[T] and the attribute of type T, with a default value being assigned in the constructor.
This immediate issue could be resolved with the following patch
diff --git a/sphinx/util/inspect.py b/sphinx/util/inspect.py
index c925485e1..8c90ccb10 100644
--- a/sphinx/util/inspect.py+++ b/sphinx/util/inspect.py@@ -666,6 +666,11 @@ def signature(
localns = TypeAliasNamespace(type_aliases)
annotations = typing.get_type_hints(subject, None, localns, include_extras=True)
for i, param in enumerate(parameters):
+ # Skip parameters which have annotations already. This is needed to avoid+ # overwriting annotations of a class __init__ with annotations of class+ # attributes.+ if param.annotation is not inspect.Parameter.empty:+ continue
if param.name in annotations:
annotation = annotations[param.name]
if isinstance(annotation, TypeAliasForwardRef):
This skips overwriting the annotation in sphinx.util.inspect.signature if there is already an annotation given by inspect.signature.
I'd be happy to create a PR and add some tests, but don't have enough context to know whether this change might break things elsewhere. The most obvious case would be if a project relies on the current overwriting behavior. Maybe this should be behind an option?
In a more complex example, I have observed that napoleon_attr_annotations = True also has the effect of overwriting the annotations; this may need a similar treatment.
Describe the bug
The following script
produces the following doc, as expected:
Now, if I just change the name of the class attribute (and name it the same as the parameter), then Sphinx gets confused.
produces the following doc, where the parameter is shown as having the type of the attribute with same name:
Having a class attribute and a constructor parameter with the same name but not exactly the same type is quite common. For example, the parameter could be of type
Optional[T]
and the attribute of typeT
, with a default value being assigned in the constructor.How to Reproduce
In index.rst:
In conf.py:
Environment Information
Sphinx extensions
No response
Additional context
No response
The text was updated successfully, but these errors were encountered: