Skip to content

Extension error with python 3.7 and Callable type hint #31

@caenrigen

Description

@caenrigen

Hi! First of all thank you for the scanpydoc.elegant_typehints looks very nice, we are adopting it for a new project.

I am running into an issue that seems to happen only for python 3.7.6+ when trying to use the Callable type hint. I have also verified that with python 3.8+ things are building ok.

For context my extension list in conf.py:

extensions = [
    "sphinx.ext.autodoc",  # auto document docstrings
    "sphinx.ext.napoleon",  # autodoc understands numpy docstrings
    # load after napoleon, improved compatibility with type hints annotations
    "sphinx_autodoc_typehints",
    "sphinx.ext.viewcode",
    "sphinx.ext.intersphinx",
    "sphinx.ext.autosectionlabel",
    "sphinx-jsonschema",
    "sphinx_rtd_theme",
    "sphinx.ext.mathjax",
    "nbsphinx",
    "jupyter_sphinx",
    "sphinxcontrib.blockdiag",
    "sphinx_togglebutton",
    "scanpydoc.elegant_typehints"
]

Problematic code:

from __future__ import annotations

import typing

def test_function(call: typing.Callable):
    """
    Some doc

    Parameters
    ----------
    call:
        some docs
    """

Running sphinx mode will raise an exception and not build the docs:

[autodoc] getattr(_, 'test_function')
[autodoc] => <function test_function at 0x134459680>
[app] emitting event: 'autodoc-before-process-signature'(<function test_function at 0x134459680>, False)
[app] emitting event: 'autodoc-process-signature'('function', 'quantify.analysis.fitting_models.test_function', <function test_function at 0x13445968
[app] emitting event: 'autodoc-process-docstring'('function', 'quantify.analysis.fitting_models.test_function', <function test_function at 0x13445968
[app] emitting event: 'build-finished'(ExtensionError("Handler <function process_docstring at 0x10a621cb0> for event 'autodoc-process-docs

Traceback (most recent call last):
  File "/usr/local/anaconda3/envs/dclab/lib/python3.7/site-packages/sphinx/events.py", line 110, in emit
    results.append(listener.handler(self.app, *args))
  File "/usr/local/anaconda3/envs/dclab/lib/python3.7/site-packages/sphinx_autodoc_typehints.py", line 385, in process_docstring
    annotation, fully_qualified=app.config.typehints_fully_qualified)
  File "/usr/local/anaconda3/envs/dclab/lib/python3.7/site-packages/scanpydoc/elegant_typehints/formatting.py", line 103, in format_annotation
    annot_fmt = format_both(annotation, fully_qualified)
  File "/usr/local/anaconda3/envs/dclab/lib/python3.7/site-packages/scanpydoc/elegant_typehints/formatting.py", line 119, in format_both
    f":annotation-terse:`{_escape(_format_terse(annotation, fully_qualified))}`\\ "
  File "/usr/local/anaconda3/envs/dclab/lib/python3.7/site-packages/scanpydoc/elegant_typehints/formatting.py", line 48, in _format_terse
    args = get_args(annotation)
  File "/usr/local/anaconda3/envs/dclab/lib/python3.7/site-packages/typing_extensions.py", line 2070, in get_args
    if get_origin(tp) is collections.abc.Callable and res[0] is not Ellipsis:
IndexError: tuple index out of range

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/usr/local/anaconda3/envs/dclab/lib/python3.7/site-packages/sphinx/cmd/build.py", line 280, in build_main
    app.build(args.force_all, filenames)
  File "/usr/local/anaconda3/envs/dclab/lib/python3.7/site-packages/sphinx/application.py", line 352, in build
    self.builder.build_update()
  File "/usr/local/anaconda3/envs/dclab/lib/python3.7/site-packages/sphinx/builders/__init__.py", line 299, in build_update
    len(to_build))
  File "/usr/local/anaconda3/envs/dclab/lib/python3.7/site-packages/sphinx/builders/__init__.py", line 311, in build
    updated_docnames = set(self.read())
  File "/usr/local/anaconda3/envs/dclab/lib/python3.7/site-packages/sphinx/builders/__init__.py", line 418, in read
    self._read_serial(docnames)
  File "/usr/local/anaconda3/envs/dclab/lib/python3.7/site-packages/sphinx/builders/__init__.py", line 439, in _read_serial
    self.read_doc(docname)
  File "/usr/local/anaconda3/envs/dclab/lib/python3.7/site-packages/sphinx/builders/__init__.py", line 479, in read_doc
    doctree = read_doc(self.app, self.env, self.env.doc2path(docname))
  File "/usr/local/anaconda3/envs/dclab/lib/python3.7/site-packages/sphinx/io.py", line 223, in read_doc
    pub.publish()
  File "/usr/local/anaconda3/envs/dclab/lib/python3.7/site-packages/docutils/core.py", line 218, in publish
    self.settings)
  File "/usr/local/anaconda3/envs/dclab/lib/python3.7/site-packages/sphinx/io.py", line 128, in read
    self.parse()
  File "/usr/local/anaconda3/envs/dclab/lib/python3.7/site-packages/docutils/readers/__init__.py", line 77, in parse
    self.parser.parse(self.input, document)
  File "/usr/local/anaconda3/envs/dclab/lib/python3.7/site-packages/sphinx/parsers.py", line 102, in parse
    self.statemachine.run(inputlines, document, inliner=self.inliner)
  File "/usr/local/anaconda3/envs/dclab/lib/python3.7/site-packages/docutils/parsers/rst/states.py", line 171, in run
    input_source=document['source'])
  File "/usr/local/anaconda3/envs/dclab/lib/python3.7/site-packages/docutils/statemachine.py", line 242, in run
    context, state, transitions)
  File "/usr/local/anaconda3/envs/dclab/lib/python3.7/site-packages/docutils/statemachine.py", line 459, in check_line
    return method(match, context, next_state)
  File "/usr/local/anaconda3/envs/dclab/lib/python3.7/site-packages/docutils/parsers/rst/states.py", line 2769, in underline
    self.section(title, source, style, lineno - 1, messages)
  File "/usr/local/anaconda3/envs/dclab/lib/python3.7/site-packages/docutils/parsers/rst/states.py", line 327, in section
    self.new_subsection(title, lineno, messages)
  File "/usr/local/anaconda3/envs/dclab/lib/python3.7/site-packages/docutils/parsers/rst/states.py", line 395, in new_subsection
    node=section_node, match_titles=True)
  File "/usr/local/anaconda3/envs/dclab/lib/python3.7/site-packages/docutils/parsers/rst/states.py", line 282, in nested_parse
    node=node, match_titles=match_titles)
  File "/usr/local/anaconda3/envs/dclab/lib/python3.7/site-packages/docutils/parsers/rst/states.py", line 196, in run
    results = StateMachineWS.run(self, input_lines, input_offset)
  File "/usr/local/anaconda3/envs/dclab/lib/python3.7/site-packages/docutils/statemachine.py", line 242, in run
    context, state, transitions)
  File "/usr/local/anaconda3/envs/dclab/lib/python3.7/site-packages/docutils/statemachine.py", line 459, in check_line
    return method(match, context, next_state)
  File "/usr/local/anaconda3/envs/dclab/lib/python3.7/site-packages/docutils/parsers/rst/states.py", line 2769, in underline
    self.section(title, source, style, lineno - 1, messages)
  File "/usr/local/anaconda3/envs/dclab/lib/python3.7/site-packages/docutils/parsers/rst/states.py", line 327, in section
    self.new_subsection(title, lineno, messages)
  File "/usr/local/anaconda3/envs/dclab/lib/python3.7/site-packages/docutils/parsers/rst/states.py", line 395, in new_subsection
    node=section_node, match_titles=True)
  File "/usr/local/anaconda3/envs/dclab/lib/python3.7/site-packages/docutils/parsers/rst/states.py", line 282, in nested_parse
    node=node, match_titles=match_titles)
  File "/usr/local/anaconda3/envs/dclab/lib/python3.7/site-packages/docutils/parsers/rst/states.py", line 196, in run
    results = StateMachineWS.run(self, input_lines, input_offset)
  File "/usr/local/anaconda3/envs/dclab/lib/python3.7/site-packages/docutils/statemachine.py", line 242, in run
    context, state, transitions)
  File "/usr/local/anaconda3/envs/dclab/lib/python3.7/site-packages/docutils/statemachine.py", line 459, in check_line
    return method(match, context, next_state)
  File "/usr/local/anaconda3/envs/dclab/lib/python3.7/site-packages/docutils/parsers/rst/states.py", line 2342, in explicit_markup
    nodelist, blank_finish = self.explicit_construct(match)
  File "/usr/local/anaconda3/envs/dclab/lib/python3.7/site-packages/docutils/parsers/rst/states.py", line 2354, in explicit_construct
    return method(self, expmatch)
  File "/usr/local/anaconda3/envs/dclab/lib/python3.7/site-packages/docutils/parsers/rst/states.py", line 2097, in directive
    directive_class, match, type_name, option_presets)
  File "/usr/local/anaconda3/envs/dclab/lib/python3.7/site-packages/docutils/parsers/rst/states.py", line 2146, in run_directive
    result = directive_instance.run()
  File "/usr/local/anaconda3/envs/dclab/lib/python3.7/site-packages/sphinx/ext/autodoc/directive.py", line 146, in run
    documenter.generate(more_content=self.content)
  File "/usr/local/anaconda3/envs/dclab/lib/python3.7/site-packages/sphinx/ext/autodoc/__init__.py", line 902, in generate
    self.document_members(all_members)
  File "/usr/local/anaconda3/envs/dclab/lib/python3.7/site-packages/sphinx/ext/autodoc/__init__.py", line 785, in document_members
    check_module=members_check_module and not isattr)
  File "/usr/local/anaconda3/envs/dclab/lib/python3.7/site-packages/sphinx/ext/autodoc/__init__.py", line 899, in generate
    self.add_content(more_content)
  File "/usr/local/anaconda3/envs/dclab/lib/python3.7/site-packages/sphinx/ext/autodoc/__init__.py", line 575, in add_content
    for i, line in enumerate(self.process_doc(docstrings)):
  File "/usr/local/anaconda3/envs/dclab/lib/python3.7/site-packages/sphinx/ext/autodoc/__init__.py", line 537, in process_doc
    self.options, docstringlines)
  File "/usr/local/anaconda3/envs/dclab/lib/python3.7/site-packages/sphinx/application.py", line 454, in emit
    return self.events.emit(event, *args, allowed_exceptions=allowed_exceptions)
  File "/usr/local/anaconda3/envs/dclab/lib/python3.7/site-packages/sphinx/events.py", line 118, in emit
    (listener.handler, name), exc) from exc
sphinx.errors.ExtensionError: Handler <function process_docstring at 0x10a621cb0> for event 'autodoc-process-docstring' threw an exception (exception: tuple index out of range)

Extension error:
Handler <function process_docstring at 0x10a621cb0> for event 'autodoc-process-docstring' threw an exception (exception: tuple index out of range)

Any idea what is causing this? Is there a way to fix this?

I am aware of sphinx_automodapi.smart_resolver (and that there is some recent progress in sphinx e.g., sphinx-doc/sphinx#9026) which would solve the main reason we adopted scanpydoc.elegant_typehints but it also looks better so it would be nice to keep using it.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions