From eddb6c34f03a76b2a9e1f7c2f3a3cfd003d21b7f Mon Sep 17 00:00:00 2001 From: Juan Carrano Date: Fri, 21 Aug 2020 14:00:48 +0200 Subject: [PATCH] autodoc: blacklist typing.Generic.__new__ When documenting classes derived from typing.Generic (essentially all classes in the typing module) the constructor signature would show an unhelpful (*args, **kwds). typing.Generic has a __new__ method which was picked up by sphinx. With this patch it is skipped and constructor signatures for generic classes are shown as they should. --- sphinx/ext/autodoc/__init__.py | 11 +++++++++++ tests/test_ext_autodoc.py | 1 - 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/sphinx/ext/autodoc/__init__.py b/sphinx/ext/autodoc/__init__.py index b61a96c8494..05681ea5eb9 100644 --- a/sphinx/ext/autodoc/__init__.py +++ b/sphinx/ext/autodoc/__init__.py @@ -1317,6 +1317,12 @@ def format_args(self, **kwargs: Any) -> Any: ] +# Types whose __new__ signature is a pass-thru. +_CLASS_NEW_BLACKLIST = [ + 'typing.Generic.__new__', +] + + class ClassDocumenter(DocstringSignatureMixin, ModuleLevelDocumenter): # type: ignore """ Specialized Documenter subclass for classes. @@ -1385,6 +1391,11 @@ def get_user_defined_function_or_method(obj: Any, attr: str) -> Any: # Now we check if the 'obj' class has a '__new__' method new = get_user_defined_function_or_method(self.object, '__new__') + + if new is not None: + if "{0.__module__}.{0.__qualname__}".format(new) in _CLASS_NEW_BLACKLIST: + new = None + if new is not None: self.env.app.emit('autodoc-before-process-signature', new, True) try: diff --git a/tests/test_ext_autodoc.py b/tests/test_ext_autodoc.py index d88e0bf7eac..3e7e3a68323 100644 --- a/tests/test_ext_autodoc.py +++ b/tests/test_ext_autodoc.py @@ -291,7 +291,6 @@ def foo3(self, d='\n'): @pytest.mark.skipif(sys.version_info < (3, 5), reason='typing is available since python3.5.') -@pytest.mark.xfail def test_autodoc_process_signature_typing_generic(app): import typing