Skip to content

DocTest sorts by lineno which may be int or None #94722

Closed

Description

@Strilanc

In doctest.py the following ordering is defined for the class DocTest:

    def __lt__(self, other):
        if not isinstance(other, DocTest):
            return NotImplemented
        return ((self.name, self.filename, self.lineno, id(self))
                <
                (other.name, other.filename, other.lineno, id(other)))

This is incorrect because the lineno field may be an integer and may be None, and comparisons between integers and None fail. Typically lineno is an integer, but _find_lineno explicitly can fall back to returning None so the field may be None:

    def _find_lineno(self, obj, source_lines):
        ...

        # We couldn't find the line number.
        return None

Linked PRs

Activity

  1. pochmann commented on Jul 10, 2022

    @pochmann
    Contributor

    Can that happen despite equal names and equal filenames?

  2. Strilanc commented on Jul 10, 2022

    @Strilanc
    Author

    I'm reporting this because I actually was getting 'int < None not valid' exceptions from this comparison. I would have included a repro but the way i was triggering it was complex enough that it really wasn't worth the time. It involved pybind, installing from sdist not wheel, machine architecture detection, patching in a __test__ dictionary with fake entries to work around properties not being tested, and more! And I wasn't able to get the bug happening consistently outside of one specific dev environment, so even if I'd given the repro I suspected it wouldn't necessarily happen on other machines.

    Even if that "names same implies lineno not null" invariant did in fact hold, that invariant is pretty complicated. It would need to be documented. Much easier to just replace self.lineno with self.lineno or -1 in the tuple.

  3. added 4 commits that reference this issue on Nov 24, 2023
  4. added
    stdlibStandard Library Python modules in the Lib/ directory
    on Nov 25, 2023
  5. added a commit that references this issue on Nov 25, 2023
  6. added 2 commits that reference this issue on Nov 25, 2023
  7. added 2 commits that reference this issue on Nov 25, 2023
  8. added a commit that references this issue on Feb 11, 2024
  9. added a commit that references this issue on Sep 2, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    stdlibStandard Library Python modules in the Lib/ directorytype-bugAn unexpected behavior, bug, or error

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions