sphinx icon indicating copy to clipboard operation
sphinx copied to clipboard

autodoc confuses constructor parameter typehint with class attribute typehint

Open jmandreoli opened this issue 2 years ago • 1 comments

Describe the bug

The following script

class MyClass:
  "An instance of this class holds a list.\n\n:param r: the list as a string"
  l: list
  def __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.

class MyClass:
  "An instance of this class holds a list.\n\n:param r: the list as a string"
  r: list
  def __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.

How to Reproduce

In index.rst:

.. toctree::
   :maxdepth: 2
   :caption: Contents:

.. automodule:: TEST
   :members:
   :member-order: bysource
   :show-inheritance:

In conf.py:

extensions = ['sphinx.ext.autodoc','sphinx.ext.viewcode']
autodoc_typehints = 'description'

Environment Information

Platform:              linux; (Linux-6.1.12-100.fc36.x86_64-x86_64-with-glibc2.35)
Python version:        3.10.9 | packaged by conda-forge | (main, Feb  2 2023, 20:20:04) [GCC 11.3.0])
Python implementation: CPython
Sphinx version:        6.1.3
Docutils version:      0.18.1
Jinja2 version:        3.1.2
Pygments version:      2.14.0

Sphinx extensions

No response

Additional context

No response

jmandreoli avatar Feb 23 '23 12:02 jmandreoli