Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

FIX: do not try to compute the boolean value of a numpy array #9530

Merged
merged 1 commit into from Aug 10, 2021

Conversation

tacaswell
Copy link
Contributor

Subject: Correctly handle numpy arrays as class attributes

Feature or Bugfix

  • Bugfix

Purpose

Detail

The following class will fail on sphinx master branch:

class IdentityTransform:
    """
    A special class that does one thing, the identity transform, in a
    fast way.
    """
    _mtx = np.identity(3)

(which is a short version of
https://github.com/matplotlib/matplotlib/blob/e044cf50021a2231760e4e95354f4b334c77525b/lib/matplotlib/transforms.py#L2073-L2120)

with:

Traceback (most recent call last):
  File "/home/tcaswell/.virtualenvs/bleeding/lib/python3.10/site-packages/sphinx/cmd/build.py", line 280, in build_main
    app.build(args.force_all, filenames)
  File "/home/tcaswell/.virtualenvs/bleeding/lib/python3.10/site-packages/sphinx/application.py", line 343, in build
    self.builder.build_update()
  File "/home/tcaswell/.virtualenvs/bleeding/lib/python3.10/site-packages/sphinx/builders/__init__.py", line 293, in build_update
    self.build(to_build,
  File "/home/tcaswell/.virtualenvs/bleeding/lib/python3.10/site-packages/sphinx/builders/__init__.py", line 307, in build
    updated_docnames = set(self.read())
  File "/home/tcaswell/.virtualenvs/bleeding/lib/python3.10/site-packages/sphinx/builders/__init__.py", line 414, in read
    self._read_serial(docnames)
  File "/home/tcaswell/.virtualenvs/bleeding/lib/python3.10/site-packages/sphinx/builders/__init__.py", line 435, in _read_serial
    self.read_doc(docname)
  File "/home/tcaswell/.virtualenvs/bleeding/lib/python3.10/site-packages/sphinx/builders/__init__.py", line 475, in read_doc
    doctree = read_doc(self.app, self.env, self.env.doc2path(docname))
  File "/home/tcaswell/.virtualenvs/bleeding/lib/python3.10/site-packages/sphinx/io.py", line 189, in read_doc
    pub.publish()
  File "/home/tcaswell/.virtualenvs/bleeding/lib/python3.10/site-packages/docutils/core.py", line 217, in publish
    self.document = self.reader.read(self.source, self.parser,
  File "/home/tcaswell/.virtualenvs/bleeding/lib/python3.10/site-packages/sphinx/io.py", line 109, in read
    self.parse()
  File "/home/tcaswell/.virtualenvs/bleeding/lib/python3.10/site-packages/docutils/readers/__init__.py", line 77, in parse
    self.parser.parse(self.input, document)
  File "/home/tcaswell/.virtualenvs/bleeding/lib/python3.10/site-packages/sphinx/parsers.py", line 101, in parse
    self.statemachine.run(inputlines, document, inliner=self.inliner)
  File "/home/tcaswell/.virtualenvs/bleeding/lib/python3.10/site-packages/docutils/parsers/rst/states.py", line 170, in run
    results = StateMachineWS.run(self, input_lines, input_offset,
  File "/home/tcaswell/.virtualenvs/bleeding/lib/python3.10/site-packages/docutils/statemachine.py", line 241, in run
    context, next_state, result = self.check_line(
  File "/home/tcaswell/.virtualenvs/bleeding/lib/python3.10/site-packages/docutils/statemachine.py", line 459, in check_line
    return method(match, context, next_state)
  File "/home/tcaswell/.virtualenvs/bleeding/lib/python3.10/site-packages/docutils/parsers/rst/states.py", line 3005, in text
    self.section(title.lstrip(), source, style, lineno + 1, messages)
  File "/home/tcaswell/.virtualenvs/bleeding/lib/python3.10/site-packages/docutils/parsers/rst/states.py", line 327, in section
    self.new_subsection(title, lineno, messages)
  File "/home/tcaswell/.virtualenvs/bleeding/lib/python3.10/site-packages/docutils/parsers/rst/states.py", line 393, in new_subsection
    newabsoffset = self.nested_parse(
  File "/home/tcaswell/.virtualenvs/bleeding/lib/python3.10/site-packages/docutils/parsers/rst/states.py", line 281, in nested_parse
    state_machine.run(block, input_offset, memo=self.memo,
  File "/home/tcaswell/.virtualenvs/bleeding/lib/python3.10/site-packages/docutils/parsers/rst/states.py", line 196, in run
    results = StateMachineWS.run(self, input_lines, input_offset)
  File "/home/tcaswell/.virtualenvs/bleeding/lib/python3.10/site-packages/docutils/statemachine.py", line 241, in run
    context, next_state, result = self.check_line(
  File "/home/tcaswell/.virtualenvs/bleeding/lib/python3.10/site-packages/docutils/statemachine.py", line 459, in check_line
    return method(match, context, next_state)
  File "/home/tcaswell/.virtualenvs/bleeding/lib/python3.10/site-packages/docutils/parsers/rst/states.py", line 2344, in explicit_markup
    self.explicit_list(blank_finish)
  File "/home/tcaswell/.virtualenvs/bleeding/lib/python3.10/site-packages/docutils/parsers/rst/states.py", line 2369, in explicit_list
    newline_offset, blank_finish = self.nested_list_parse(
  File "/home/tcaswell/.virtualenvs/bleeding/lib/python3.10/site-packages/docutils/parsers/rst/states.py", line 318, in nested_list_parse
    state_machine.run(block, input_offset, memo=self.memo,
  File "/home/tcaswell/.virtualenvs/bleeding/lib/python3.10/site-packages/docutils/parsers/rst/states.py", line 196, in run
    results = StateMachineWS.run(self, input_lines, input_offset)
  File "/home/tcaswell/.virtualenvs/bleeding/lib/python3.10/site-packages/docutils/statemachine.py", line 241, in run
    context, next_state, result = self.check_line(
  File "/home/tcaswell/.virtualenvs/bleeding/lib/python3.10/site-packages/docutils/statemachine.py", line 459, in check_line
    return method(match, context, next_state)
  File "/home/tcaswell/.virtualenvs/bleeding/lib/python3.10/site-packages/docutils/parsers/rst/states.py", line 2647, in explicit_markup
    nodelist, blank_finish = self.explicit_construct(match)
  File "/home/tcaswell/.virtualenvs/bleeding/lib/python3.10/site-packages/docutils/parsers/rst/states.py", line 2354, in explicit_construct
    return method(self, expmatch)
  File "/home/tcaswell/.virtualenvs/bleeding/lib/python3.10/site-packages/docutils/parsers/rst/states.py", line 2096, in directive
    return self.run_directive(
  File "/home/tcaswell/.virtualenvs/bleeding/lib/python3.10/site-packages/docutils/parsers/rst/states.py", line 2146, in run_directive
    result = directive_instance.run()
  File "/home/tcaswell/.virtualenvs/bleeding/lib/python3.10/site-packages/sphinx/ext/autodoc/directive.py", line 162, in run
    documenter.generate(more_content=self.content)
  File "/home/tcaswell/.virtualenvs/bleeding/lib/python3.10/site-packages/sphinx/ext/autodoc/__init__.py", line 979, in generate
    self.document_members(all_members)
  File "/home/tcaswell/.virtualenvs/bleeding/lib/python3.10/site-packages/sphinx/ext/autodoc/__init__.py", line 860, in document_members
    documenter.generate(
  File "/home/tcaswell/.virtualenvs/bleeding/lib/python3.10/site-packages/sphinx/ext/autodoc/__init__.py", line 1769, in generate
    return super().generate(more_content=more_content,
  File "/home/tcaswell/.virtualenvs/bleeding/lib/python3.10/site-packages/sphinx/ext/autodoc/__init__.py", line 979, in generate
    self.document_members(all_members)
  File "/home/tcaswell/.virtualenvs/bleeding/lib/python3.10/site-packages/sphinx/ext/autodoc/__init__.py", line 1760, in document_members
    super().document_members(all_members)
  File "/home/tcaswell/.virtualenvs/bleeding/lib/python3.10/site-packages/sphinx/ext/autodoc/__init__.py", line 842, in document_members
    for (mname, member, isattr) in self.filter_members(members, want_all):
  File "/home/tcaswell/.virtualenvs/bleeding/lib/python3.10/site-packages/sphinx/ext/autodoc/__init__.py", line 723, in filter_members
    doc = getdoc(member, self.get_attr, self.config.autodoc_inherit_docstrings,
  File "/home/tcaswell/.virtualenvs/bleeding/lib/python3.10/site-packages/sphinx/util/inspect.py", line 848, in getdoc
    if cls and name and isclassmethod(obj, cls, name):
  File "/home/tcaswell/.virtualenvs/bleeding/lib/python3.10/site-packages/sphinx/util/inspect.py", line 260, in isclassmethod
    if meth:
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

This issue was introduced in 38d80c3

If there is a numpy array as a class attribute, then `bool(meth)` will
raise.
@tacaswell
Copy link
Contributor Author

I am not sure how to test this without adding a numpy dependency to the test suite.

@astrojuanlu
Copy link
Contributor

What about creating a dummy class like this?

>>> class F:
...   def __bool__(self):
...     raise ValueError("Cannot get truth value")
... 
>>> f = F()
>>> if f:
...   pass
... 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in __bool__
ValueError: Cannot get truth value

@tk0miya tk0miya added this to the 4.2.0 milestone Aug 10, 2021
@tk0miya tk0miya merged commit c66b3ad into sphinx-doc:4.x Aug 10, 2021
@tk0miya
Copy link
Member

tk0miya commented Aug 10, 2021

Thank you for your contribution!

@tacaswell
Copy link
Contributor Author

Thanks for the merge! I had not responded, but did plan to add the test suggested by @astrojuanlu . Hopefully I'll find the time to follow up this week...

@tacaswell tacaswell deleted the fix_numpy_class_attribute branch August 10, 2021 17:20
@github-actions github-actions bot locked as resolved and limited conversation to collaborators Sep 10, 2021
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

3 participants