Skip to content

Autodoc TypeError: issubclass() ; provides no info on cause #9095

@dmyersturnbull

Description

@dmyersturnbull

Describe the bug

The failure is when using the solution by James Leedham on this SO post, a workaround for autodoc not being recursive. The broader issue is that the stack trace provides no information about what files the failure occurred on (or why it occurred). See the log at the bottom of this issue.

To Reproduce
Steps to reproduce the behavior:

<Paste your command-line here which cause the problem>

$ git clone https://github.com/dmyersturnbull/mandos.git
$ cd mandos
$ git checkout ddff4b52e974b6f4de505d1fb1cee7908acba9a7
$ pip install .
$  sphinx-build -b html docs docs/_build

Expected behavior

Docs to build without errors, of course :)

Your project
https://github.com/dmyersturnbull/mandos

Environment info

  • OS: Win
  • Python version: 3.9.1
  • Sphinx version: 3.4.3
  • Sphinx extensions: sphinx.ext.autodoc, sphinx.ext.autosummary, sphinx_autodoc_typehints, sphinx.ext.napoleon, sphinx_copybutton, sphinxcontrib.mermaid, sphinx_rtd_theme
  • Extra tools: none

Additional context

The cause is this line in custom-module-template.rst:

:template: custom-module-template.rst

If I remove that line: It builds without failure, BUT only builds reST and HTML pages for classes directly under mandos, not those under submodules.

# Sphinx version: 3.4.3
# Python version: 3.9.1 (CPython)
# Docutils version: 0.16 release
# Jinja2 version: 2.11.2
# Last messages:
#   updating environment:
#   [new config]
#   529 added, 0 changed, 0 removed
#   reading sources... [  0%] _autosummary/mandos
#   reading sources... [  0%] _autosummary/mandos.InterceptHandler
#   reading sources... [  0%] _autosummary/mandos.MandosLogging
#   reading sources... [  0%] _autosummary/mandos.MandosMetadata
#   reading sources... [  0%] _autosummary/mandos.Path
#   reading sources... [  1%] _autosummary/mandos.cli
#   reading sources... [  1%] _autosummary/mandos.cli.Apis
# Loaded extensions:
#   sphinx.ext.mathjax (3.4.3) from c:\users\dmyer\.conda\envs\py39\lib\site-packages\sphinx\ext\mathjax.py
#   sphinxcontrib.applehelp (1.0.2) from c:\users\dmyer\.conda\envs\py39\lib\site-packages\sphinxcontrib\applehelp\__init__.py
#   sphinxcontrib.devhelp (1.0.2) from c:\users\dmyer\.conda\envs\py39\lib\site-packages\sphinxcontrib\devhelp\__init__.py
#   sphinxcontrib.htmlhelp (1.0.3) from c:\users\dmyer\.conda\envs\py39\lib\site-packages\sphinxcontrib\htmlhelp\__init__.py
#   sphinxcontrib.serializinghtml (1.1.4) from c:\users\dmyer\.conda\envs\py39\lib\site-packages\sphinxcontrib\serializinghtml\__init__.py
#   sphinxcontrib.qthelp (1.0.3) from c:\users\dmyer\.conda\envs\py39\lib\site-packages\sphinxcontrib\qthelp\__init__.py
#   alabaster (0.7.12) from c:\users\dmyer\.conda\envs\py39\lib\site-packages\alabaster\__init__.py
#   sphinx.ext.autodoc.type_comment (3.4.3) from c:\users\dmyer\.conda\envs\py39\lib\site-packages\sphinx\ext\autodoc\type_comment.py
#   sphinx.ext.autodoc (3.4.3) from c:\users\dmyer\.conda\envs\py39\lib\site-packages\sphinx\ext\autodoc\__init__.py
#   sphinx.ext.autosummary (3.4.3) from c:\users\dmyer\.conda\envs\py39\lib\site-packages\sphinx\ext\autosummary\__init__.py
#   sphinx_autodoc_typehints (unknown version) from c:\users\dmyer\.conda\envs\py39\lib\site-packages\sphinx_autodoc_typehints.py
#   sphinx.ext.napoleon (3.4.3) from c:\users\dmyer\.conda\envs\py39\lib\site-packages\sphinx\ext\napoleon\__init__.py
#   sphinx_copybutton (0.3.1) from c:\users\dmyer\.conda\envs\py39\lib\site-packages\sphinx_copybutton\__init__.py
#   sphinxcontrib.mermaid (3.4.3) from c:\users\dmyer\.conda\envs\py39\lib\site-packages\sphinxcontrib\mermaid.py
#   sphinx_rtd_theme (unknown version) from c:\users\dmyer\.conda\envs\py39\lib\site-packages\sphinx_rtd_theme\__init__.py
Traceback (most recent call last):
  File "c:\users\dmyer\.conda\envs\py39\lib\site-packages\sphinx\cmd\build.py", line 280, in build_main
    app.build(args.force_all, filenames)
  File "c:\users\dmyer\.conda\envs\py39\lib\site-packages\sphinx\application.py", line 352, in build
    self.builder.build_update()
  File "c:\users\dmyer\.conda\envs\py39\lib\site-packages\sphinx\builders\__init__.py", line 296, in build_update
    self.build(to_build,
  File "c:\users\dmyer\.conda\envs\py39\lib\site-packages\sphinx\builders\__init__.py", line 310, in build
    updated_docnames = set(self.read())
  File "c:\users\dmyer\.conda\envs\py39\lib\site-packages\sphinx\builders\__init__.py", line 417, in read
    self._read_serial(docnames)
  File "c:\users\dmyer\.conda\envs\py39\lib\site-packages\sphinx\builders\__init__.py", line 438, in _read_serial
    self.read_doc(docname)
  File "c:\users\dmyer\.conda\envs\py39\lib\site-packages\sphinx\builders\__init__.py", line 478, in read_doc
    doctree = read_doc(self.app, self.env, self.env.doc2path(docname))
  File "c:\users\dmyer\.conda\envs\py39\lib\site-packages\sphinx\io.py", line 221, in read_doc
    pub.publish()
  File "c:\users\dmyer\.conda\envs\py39\lib\site-packages\docutils\core.py", line 217, in publish
    self.document = self.reader.read(self.source, self.parser,
  File "c:\users\dmyer\.conda\envs\py39\lib\site-packages\sphinx\io.py", line 126, in read
    self.parse()
  File "c:\users\dmyer\.conda\envs\py39\lib\site-packages\docutils\readers\__init__.py", line 77, in parse
    self.parser.parse(self.input, document)
  File "c:\users\dmyer\.conda\envs\py39\lib\site-packages\sphinx\parsers.py", line 104, in parse
    self.statemachine.run(inputlines, document, inliner=self.inliner)
  File "c:\users\dmyer\.conda\envs\py39\lib\site-packages\docutils\parsers\rst\states.py", line 170, in run
    results = StateMachineWS.run(self, input_lines, input_offset,
  File "c:\users\dmyer\.conda\envs\py39\lib\site-packages\docutils\statemachine.py", line 241, in run
    context, next_state, result = self.check_line(
  File "c:\users\dmyer\.conda\envs\py39\lib\site-packages\docutils\statemachine.py", line 459, in check_line
    return method(match, context, next_state)
  File "c:\users\dmyer\.conda\envs\py39\lib\site-packages\docutils\parsers\rst\states.py", line 2769, in underline
    self.section(title, source, style, lineno - 1, messages)
  File "c:\users\dmyer\.conda\envs\py39\lib\site-packages\docutils\parsers\rst\states.py", line 327, in section
    self.new_subsection(title, lineno, messages)
  File "c:\users\dmyer\.conda\envs\py39\lib\site-packages\docutils\parsers\rst\states.py", line 393, in new_subsection
    newabsoffset = self.nested_parse(
  File "c:\users\dmyer\.conda\envs\py39\lib\site-packages\docutils\parsers\rst\states.py", line 281, in nested_parse
    state_machine.run(block, input_offset, memo=self.memo,
  File "c:\users\dmyer\.conda\envs\py39\lib\site-packages\docutils\parsers\rst\states.py", line 196, in run
    results = StateMachineWS.run(self, input_lines, input_offset)
  File "c:\users\dmyer\.conda\envs\py39\lib\site-packages\docutils\statemachine.py", line 241, in run
    context, next_state, result = self.check_line(
  File "c:\users\dmyer\.conda\envs\py39\lib\site-packages\docutils\statemachine.py", line 459, in check_line
    return method(match, context, next_state)
  File "c:\users\dmyer\.conda\envs\py39\lib\site-packages\docutils\parsers\rst\states.py", line 2344, in explicit_markup
    self.explicit_list(blank_finish)
  File "c:\users\dmyer\.conda\envs\py39\lib\site-packages\docutils\parsers\rst\states.py", line 2369, in explicit_list
    newline_offset, blank_finish = self.nested_list_parse(
  File "c:\users\dmyer\.conda\envs\py39\lib\site-packages\docutils\parsers\rst\states.py", line 318, in nested_list_parse
    state_machine.run(block, input_offset, memo=self.memo,
  File "c:\users\dmyer\.conda\envs\py39\lib\site-packages\docutils\parsers\rst\states.py", line 196, in run
    results = StateMachineWS.run(self, input_lines, input_offset)
  File "c:\users\dmyer\.conda\envs\py39\lib\site-packages\docutils\statemachine.py", line 241, in run
    context, next_state, result = self.check_line(
  File "c:\users\dmyer\.conda\envs\py39\lib\site-packages\docutils\statemachine.py", line 459, in check_line
    return method(match, context, next_state)
  File "c:\users\dmyer\.conda\envs\py39\lib\site-packages\docutils\parsers\rst\states.py", line 2647, in explicit_markup
    nodelist, blank_finish = self.explicit_construct(match)
  File "c:\users\dmyer\.conda\envs\py39\lib\site-packages\docutils\parsers\rst\states.py", line 2354, in explicit_construct
    return method(self, expmatch)
  File "c:\users\dmyer\.conda\envs\py39\lib\site-packages\docutils\parsers\rst\states.py", line 2096, in directive
    return self.run_directive(
  File "c:\users\dmyer\.conda\envs\py39\lib\site-packages\docutils\parsers\rst\states.py", line 2146, in run_directive
    result = directive_instance.run()
  File "c:\users\dmyer\.conda\envs\py39\lib\site-packages\sphinx\ext\autodoc\directive.py", line 157, in run
    result = parse_generated_content(self.state, params.result, documenter)
  File "c:\users\dmyer\.conda\envs\py39\lib\site-packages\sphinx\ext\autodoc\directive.py", line 104, in parse_generated_content
    state.nested_parse(content, 0, node)
  File "c:\users\dmyer\.conda\envs\py39\lib\site-packages\docutils\parsers\rst\states.py", line 281, in nested_parse
    state_machine.run(block, input_offset, memo=self.memo,
  File "c:\users\dmyer\.conda\envs\py39\lib\site-packages\docutils\parsers\rst\states.py", line 196, in run
    results = StateMachineWS.run(self, input_lines, input_offset)
  File "c:\users\dmyer\.conda\envs\py39\lib\site-packages\docutils\statemachine.py", line 241, in run
    context, next_state, result = self.check_line(
  File "c:\users\dmyer\.conda\envs\py39\lib\site-packages\docutils\statemachine.py", line 459, in check_line
    return method(match, context, next_state)
  File "c:\users\dmyer\.conda\envs\py39\lib\site-packages\docutils\parsers\rst\states.py", line 2342, in explicit_markup
    nodelist, blank_finish = self.explicit_construct(match)
  File "c:\users\dmyer\.conda\envs\py39\lib\site-packages\docutils\parsers\rst\states.py", line 2354, in explicit_construct
    return method(self, expmatch)
  File "c:\users\dmyer\.conda\envs\py39\lib\site-packages\docutils\parsers\rst\states.py", line 2096, in directive
    return self.run_directive(
  File "c:\users\dmyer\.conda\envs\py39\lib\site-packages\docutils\parsers\rst\states.py", line 2146, in run_directive
    result = directive_instance.run()
  File "c:\users\dmyer\.conda\envs\py39\lib\site-packages\sphinx\domains\__init__.py", line 285, in run
    return super().run()
  File "c:\users\dmyer\.conda\envs\py39\lib\site-packages\sphinx\directives\__init__.py", line 207, in run
    self.state.nested_parse(self.content, self.content_offset, contentnode)
  File "c:\users\dmyer\.conda\envs\py39\lib\site-packages\docutils\parsers\rst\states.py", line 281, in nested_parse
    state_machine.run(block, input_offset, memo=self.memo,
  File "c:\users\dmyer\.conda\envs\py39\lib\site-packages\docutils\parsers\rst\states.py", line 196, in run
    results = StateMachineWS.run(self, input_lines, input_offset)
  File "c:\users\dmyer\.conda\envs\py39\lib\site-packages\docutils\statemachine.py", line 241, in run
    context, next_state, result = self.check_line(
  File "c:\users\dmyer\.conda\envs\py39\lib\site-packages\docutils\statemachine.py", line 459, in check_line
    return method(match, context, next_state)
  File "c:\users\dmyer\.conda\envs\py39\lib\site-packages\docutils\parsers\rst\states.py", line 2344, in explicit_markup
    self.explicit_list(blank_finish)
  File "c:\users\dmyer\.conda\envs\py39\lib\site-packages\docutils\parsers\rst\states.py", line 2369, in explicit_list
    newline_offset, blank_finish = self.nested_list_parse(
  File "c:\users\dmyer\.conda\envs\py39\lib\site-packages\docutils\parsers\rst\states.py", line 318, in nested_list_parse
    state_machine.run(block, input_offset, memo=self.memo,
  File "c:\users\dmyer\.conda\envs\py39\lib\site-packages\docutils\parsers\rst\states.py", line 196, in run
    results = StateMachineWS.run(self, input_lines, input_offset)
  File "c:\users\dmyer\.conda\envs\py39\lib\site-packages\docutils\statemachine.py", line 241, in run
    context, next_state, result = self.check_line(
  File "c:\users\dmyer\.conda\envs\py39\lib\site-packages\docutils\statemachine.py", line 459, in check_line
    return method(match, context, next_state)
  File "c:\users\dmyer\.conda\envs\py39\lib\site-packages\docutils\parsers\rst\states.py", line 2647, in explicit_markup
    nodelist, blank_finish = self.explicit_construct(match)
  File "c:\users\dmyer\.conda\envs\py39\lib\site-packages\docutils\parsers\rst\states.py", line 2354, in explicit_construct
    return method(self, expmatch)
  File "c:\users\dmyer\.conda\envs\py39\lib\site-packages\docutils\parsers\rst\states.py", line 2096, in directive
    return self.run_directive(
  File "c:\users\dmyer\.conda\envs\py39\lib\site-packages\docutils\parsers\rst\states.py", line 2146, in run_directive
    result = directive_instance.run()
  File "c:\users\dmyer\.conda\envs\py39\lib\site-packages\sphinx\ext\autosummary\__init__.py", line 247, in run
    items = self.get_items(names)
  File "c:\users\dmyer\.conda\envs\py39\lib\site-packages\sphinx\ext\autosummary\__init__.py", line 349, in get_items
    if not documenter.import_object():
  File "c:\users\dmyer\.conda\envs\py39\lib\site-packages\sphinx\ext\autodoc\__init__.py", line 2344, in import_object
    ret = super().import_object(raiseerror=True)
  File "c:\users\dmyer\.conda\envs\py39\lib\site-packages\sphinx\ext\autodoc\__init__.py", line 2147, in import_object
    ret = super().import_object(raiseerror)  # type: ignore
  File "c:\users\dmyer\.conda\envs\py39\lib\site-packages\sphinx\ext\autodoc\__init__.py", line 2222, in import_object
    return super().import_object(raiseerror=True)  # type: ignore
  File "c:\users\dmyer\.conda\envs\py39\lib\site-packages\sphinx\ext\autodoc\__init__.py", line 2100, in import_object
    ret = super().import_object(raiseerror)  # type: ignore
  File "c:\users\dmyer\.conda\envs\py39\lib\site-packages\sphinx\ext\autodoc\__init__.py", line 421, in import_object
    ret = import_object(self.modname, self.objpath, self.objtype,
  File "c:\users\dmyer\.conda\envs\py39\lib\site-packages\sphinx\ext\autodoc\importer.py", line 108, in import_object
    logger.debug('[autodoc] => %r', obj)
  File "c:\users\dmyer\.conda\envs\py39\lib\logging\__init__.py", line 1788, in debug
    self.log(DEBUG, msg, *args, **kwargs)
  File "c:\users\dmyer\.conda\envs\py39\lib\site-packages\sphinx\util\logging.py", line 126, in log
    super().log(level, msg, *args, **kwargs)
  File "c:\users\dmyer\.conda\envs\py39\lib\logging\__init__.py", line 1832, in log
    self.logger.log(level, msg, *args, **kwargs)
  File "c:\users\dmyer\.conda\envs\py39\lib\logging\__init__.py", line 1500, in log
    self._log(level, msg, args, **kwargs)
  File "c:\users\dmyer\.conda\envs\py39\lib\logging\__init__.py", line 1575, in _log
    record = self.makeRecord(self.name, level, fn, lno, msg, args,
  File "c:\users\dmyer\.conda\envs\py39\lib\logging\__init__.py", line 1544, in makeRecord
    rv = _logRecordFactory(name, level, fn, lno, msg, args, exc_info, func,
  File "c:\users\dmyer\.conda\envs\py39\lib\logging\__init__.py", line 304, in __init__
    if (args and len(args) == 1 and isinstance(args[0], collections.abc.Mapping)
  File "c:\users\dmyer\.conda\envs\py39\lib\abc.py", line 98, in __instancecheck__
    return _abc_instancecheck(cls, instance)
  File "c:\users\dmyer\.conda\envs\py39\lib\abc.py", line 102, in __subclasscheck__
    return _abc_subclasscheck(cls, subclass)
TypeError: issubclass() arg 1 must be a class

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions