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

TestLoader.loadTestsFromName swallows import errors #51808

Closed
rbtcollins opened this issue Dec 21, 2009 · 60 comments
Closed

TestLoader.loadTestsFromName swallows import errors #51808

rbtcollins opened this issue Dec 21, 2009 · 60 comments
Assignees
Labels
easy stdlib Python modules in the Lib dir type-bug An unexpected behavior, bug, or error

Comments

@rbtcollins
Copy link
Member

BPO 7559
Nosy @brettcannon, @rbtcollins, @mcepl, @ezio-melotti, @bitdancer, @voidspace, @cjerdonek, @Julian, @ericsnowcurrently, @berkerpeksag, @zware, @timgraham
Files
  • issuee7559_trunk_patch.diff: Patch against trunk (work in progress)
  • issuee7559_trunk_patch.diff: Patch against trunk, adds new unittest.
  • _patch-7559-2.diff: Patch against trunk (work in progress)
  • _patch-7559-3.diff: Patch against trunk (needs review)
  • _patch-7559-4-unittests.diff: Candidate unit tests (4 tests)
  • _patch-7559-5.diff: Patch against trunk (minor clean-up needed)
  • alternate_import_fix.patch
  • _patch-7559-6.diff: Requesting review
  • unittest_loader_import_error.patch
  • issue7559.patch: Obsolete
  • issue7559.patch
  • issue7559.patch
  • issue7559.patch
  • Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.

    Show more details

    GitHub fields:

    assignee = 'https://github.com/voidspace'
    closed_at = <Date 2014-10-29.19:29:09.736>
    created_at = <Date 2009-12-21.21:07:15.519>
    labels = ['easy', 'type-bug', 'library']
    title = 'TestLoader.loadTestsFromName swallows import errors'
    updated_at = <Date 2016-01-11.16:39:58.962>
    user = 'https://github.com/rbtcollins'

    bugs.python.org fields:

    activity = <Date 2016-01-11.16:39:58.962>
    actor = 'mcepl'
    assignee = 'michael.foord'
    closed = True
    closed_date = <Date 2014-10-29.19:29:09.736>
    closer = 'python-dev'
    components = ['Library (Lib)']
    creation = <Date 2009-12-21.21:07:15.519>
    creator = 'rbcollins'
    dependencies = []
    files = ['15686', '15728', '16759', '16796', '16819', '16822', '16829', '16862', '25790', '36578', '36974', '37002', '37045']
    hgrepos = []
    issue_num = 7559
    keywords = ['patch', 'easy']
    message_count = 60.0
    messages = ['96770', '96774', '96777', '96787', '96788', '96789', '96790', '96891', '96956', '97180', '97457', '97462', '101867', '102236', '102356', '102519', '102550', '102554', '102603', '102621', '102638', '102643', '102708', '102719', '102801', '140187', '140297', '140328', '158911', '158920', '158921', '162101', '162190', '162212', '162239', '162241', '162264', '162265', '162266', '162272', '185310', '185328', '185329', '221984', '221985', '226614', '226616', '226633', '226658', '226663', '226666', '226667', '229705', '229911', '230104', '230234', '230557', '230565', '230734', '244687']
    nosy_count = 18.0
    nosy_names = ['brett.cannon', 'rbcollins', 'vila', 'mcepl', 'iElectric', 'ezio.melotti', 'r.david.murray', 'michael.foord', 'slmnhq', 'chris.jerdonek', 'BreamoreBoy', 'Julian', 'python-dev', 'eric.snow', 'alexgarel', 'berker.peksag', 'zach.ware', 'Tim.Graham']
    pr_nums = []
    priority = 'normal'
    resolution = 'fixed'
    stage = 'resolved'
    status = 'closed'
    superseder = None
    type = 'behavior'
    url = 'https://bugs.python.org/issue7559'
    versions = ['Python 3.5']

    @rbtcollins
    Copy link
    Member Author

    Say I have a test module test_foo, which fails to import with
    ImportError. A reason for this might be a misspelt import in that module.

    TestLoader().loadTestsFromName swallows the import error and instead
    crashes with:
    File "/usr/lib/python2.6/unittest.py", line 584, in loadTestsFromName
    parent, obj = obj, getattr(obj, part)
    AttributeError: 'module' object has no attribute 'test_foo'

    A better thing to do would be to keep the import error and if the next
    probe is an Attribute error, reraise the import error.
    An alternative would be to return a test which would then reraise the
    import error permitting the test suite to be constructed and execute but
    still reporting the error.

    @rbtcollins rbtcollins added the stdlib Python modules in the Lib dir label Dec 21, 2009
    @bitdancer
    Copy link
    Member

    Could you provide a more complete recipe for reproducing the problem,
    please? I created a test_foo.py containing 'import blert', and running
    python -m unittest test_foo does not mask the import error for blert in
    loadTestsFromName:

    ...
    File "/usr/lib/python2.6/unittest.py", line 576, in loadTestsFromName
    module = __import__('.'.join(parts_copy))
    File "test_foo.py", line 1, in <module>
    import blert
    ImportError: No module named blert

    @bitdancer bitdancer added the type-bug An unexpected behavior, bug, or error label Dec 21, 2009
    @rbtcollins
    Copy link
    Member Author

    mkdir thing
    touch thing/__init__.py
    echo "import blert" > thing/test_foo.py
    python -m unittest thing.test_fooTraceback (most recent call last):
      File "/usr/lib/python2.6/runpy.py", line 122, in _run_module_as_main
        "__main__", fname, loader, pkg_name)
      File "/usr/lib/python2.6/runpy.py", line 34, in _run_code
        exec code in run_globals
      File "/usr/lib/python2.6/unittest.py", line 875, in <module>
        main(module=None)
      File "/usr/lib/python2.6/unittest.py", line 816, in __init__
        self.parseArgs(argv)
      File "/usr/lib/python2.6/unittest.py", line 843, in parseArgs
        self.createTests()
      File "/usr/lib/python2.6/unittest.py", line 849, in createTests
        self.module)
      File "/usr/lib/python2.6/unittest.py", line 613, in loadTestsFromNames
        suites = [self.loadTestsFromName(name, module) for name in names]
      File "/usr/lib/python2.6/unittest.py", line 584, in loadTestsFromName
        parent, obj = obj, getattr(obj, part)
    AttributeError: 'module' object has no attribute 'test_foo'

    @bitdancer
    Copy link
    Member

    Thank you. I can reproduce this on trunk as well. I'm leaving stage
    set to test needed because we need to turn this into a unit test.

    @bitdancer bitdancer added the easy label Dec 22, 2009
    @bitdancer
    Copy link
    Member

    Note: this problem is similar in some ways to bpo-5230, and a similar
    solution might be appropriate (or might not :).

    @voidspace
    Copy link
    Contributor

    I'll try and look at both these issues in the next few days unless one
    of you beats me to it. :-)

    @rbtcollins
    Copy link
    Member Author

    I'm scratching an itch at the moment, I just noted this in passing ;)

    I'm partial to the 'turn it into a fake test case' approach, its what I
    would do if I get to it first.

    @slmnhq
    Copy link
    Mannequin

    slmnhq mannequin commented Dec 26, 2009

    Line 348 in trunk/Lib/test/test_unittest.py has a test case to
    specifically test that in the described situation, the test returns an
    AttributeError. Should this test be changed so that it passes if the
    exception is in fact an ImportError?

       def test_loadTestsFromName__unknown_attr_name(self):
            loader = unittest.TestLoader()
        try:
            loader.loadTestsFromName('unittest.sdasfasfasdf')
        except AttributeError, e:
            self.assertEqual(str(e), "'module' object has no attribute
    

    'sdasfasfasdf'")
    else:
    self.fail("TestLoader.loadTestsFromName failed to raise
    AttributeError")

    @slmnhq
    Copy link
    Mannequin

    slmnhq mannequin commented Dec 28, 2009

    I'm attaching a patch (against trunk) which I think is a step in the
    right direction but I could use some feedback.

    This patch modifies 'loadTestsFromName()' so that it saves and re-raises
    an ImportError.

    Further this patch introduces a new unittest
    (test_loadTestsFromName__badimport) and slightly modifies two existing
    unittests (test_loadTestsFromName__unknown_attr_name,
    test_loadTestsFromNames__unknown_attr_name) in test_unittest.py. Also, I
    think a second new unittest is needed (test_loadTestsFromNames__badimport).

    @slmnhq
    Copy link
    Mannequin

    slmnhq mannequin commented Jan 3, 2010

    Hope everyone had a good new year's. I've attached an updated patch which adds a new unittest, test_loadTestsFromNames__badimport.

    Both the new unittests can use better documentation, hopefully one of you can help me with that.

    @voidspace
    Copy link
    Contributor

    Wouldn't this be a backwards incompatible change of tested behaviour though?

    @voidspace
    Copy link
    Contributor

    I'm unhappy with a straight change in behaviour because it will break code that is currently catching AttributeError.

    A slightly less invasive change would be to raise an AttributeError if the module doesn't exist, otherwise letting the original error propagate.

    That means distinguishing between a module not existing and an ImportError raised whilst importing the module. Example code that does this by walking the stack: http://twistedmatrix.com/trac/browser/trunk/twisted/python/reflect.py#L382

    In addition we could add a new method that loads a test from name, returning an 'ErrorHolder' if loading the test fails. (A TestCase that reraises the original error when run - test discovery already does this in fact so that a test module failing to load doesn't halt discovery.)

    @voidspace voidspace self-assigned this Jan 9, 2010
    @cjerdonek
    Copy link
    Member

    I was also hit by this today.

    For the sake of clarity, I will restate two of the scenarios that have been mentioned in this discussion:

    (1) An ImportError raised whilst importing a module (original issue)
    (2) A sub-module not existing.

    I think the error text should be better in both cases and not just in case (1).

    Currently, both (1) and (2) yield an error like the following:

    AttributeError: 'module' object has no attribute 'subpackage1'

    But also in case (2), the AttributeError reveals less information than the exception that was trapped earlier:

    ImportError: No module named subpackage1.subpackage2

    I think in both cases the error text should state not just what module was being imported but also what module was being imported from -- e.g. root_package.subpackage1.subpackage2. In other words, it should also include the leading parts of--

    '.'.join(parts_copy)

    In my case, I passed a list of modules to unittest, and it wasn't clear which one it was failing on by looking at only the trailing segment. Thanks.

    @cjerdonek
    Copy link
    Member

    I think in both cases the error text should state not just what module was being imported but also what module was being imported from

    FYI, I filed the following report partly in response to some of the comments I made above:

    http://bugs.python.org/issue8297

    (regarding the AttributeError not displaying the name of the module from which the caller is trying to get the attribute)

    @cjerdonek
    Copy link
    Member

    This patch implements Michael's suggestion (but not the ErrorHolder part):

    http://bugs.python.org/issue7559#msg97462

    The unit tests all pass with no change. If this approach looks good to you, I can add a unit test to the patch that checks that this bug has been fixed.

    Also, Twisted Matrix's web site doesn't seem to be responding too well at the moment, but if I recall correctly, their code has a permissive (MIT?) license that should allow a small snippet like this to be copied without taking extra steps.

    @cjerdonek
    Copy link
    Member

    Rietveld link: http://codereview.appspot.com/810044/show

    This patch changes unittest.TestLoader.loadTestsFromName() so that ImportErrors will bubble up when importing from a module with a bad import statement. Before the method raised an AttributeError. The unit test code is taken from a patch by Salman Haq. The patch also includes code adapted from http://twistedmatrix.com .

    (This is my first patch, so any guidance is greatly appreciated. Thanks.)

    @bitdancer
    Copy link
    Member

    The unit test passes on trunk for me without the fix applied.

    @cjerdonek
    Copy link
    Member

    Thanks, David. Sorry about that. The test probably requires one additional level of nesting so that "parts_copy" is not False:

    + if not parts_copy or not module_not_found:
    raise

    @cjerdonek
    Copy link
    Member

    FYI, there seems to be a bug in the code cited above:

    http://twistedmatrix.com/trac/browser/trunk/twisted/python/reflect.py#L382

    For example, _importAndCheckStack('package.subpackage.module') raises
    _NoModuleFound in the following scenario:

    package/subpackage/init.py:
    import no_exist

    when it should instead raise an ImportError from the buggy __init__.py.

    I now think there should be at least a few unit tests to cover this case and a couple similar permutations.

    @cjerdonek
    Copy link
    Member

    Four failing unit tests (context code can use clean-up).

    @cjerdonek
    Copy link
    Member

    The new unit tests pass with this patch (minor clean-up still needed).

    @bitdancer
    Copy link
    Member

    Thank you very much for those tests. I think you can simplify them a bit. For example, you can use assertRaises. You also might be able to use the test_support.temp_cwd context manager in your context manager, even though you don't need the cwd part.

    I've attached an alternate, simpler patch to fix this bug, based on a similar fix I did in pydoc. The disadvantage of my patch is that it contains a hardcoding of the name of the function doing the import. I think this is acceptable given the much greater simplicity of my patch. I may be missing some subtlety, though, that the twisted folks know about. Or perhaps people will just find the hardcoding itself objectionable.

    @cjerdonek
    Copy link
    Member

    Thanks for your suggestions on the test code. I will do that.

    It seems like the hard-coded approach would be more brittle. For example, if someone wants to replace __import__ with their own, e.g.

    old__import__ = __builtins__.__import__
    
    def __my_logging_import(*args, **kwargs):
        print "Importing %s..." % args[0]  # module name
        return old__import__(*args, **kwargs)
    
    __builtins__.__import__ = __my_logging_import

    Then the stack traces would be different:

    File "/Users/chris_g4/dev/Python/trunk/Lib/unittest/loader.py", line 92, in loadTestsFromName
    module = __import__('.'.join(parts_copy))
    File "unittests.py", line 8, in __my_logging_import
    return old__import__(*args, **kwargs)
    ImportError: No module named sdasfasfasdf

    This causes the unit tests not to pass.

    @cjerdonek
    Copy link
    Member

    I think you can simplify them a bit. For example, you can use assertRaises.

    Actually, assertRaises doesn't seem to permit checking error text. That may be one reason why try-except-else is being used instead throughout.

    @cjerdonek
    Copy link
    Member

    Patch update: added unit test to cover replacing __import__, incorporated R. David Murray's suggestion to use test_support.test_cwd(), and overall code clean-up.

    Also uploaded as Patch 3 to--

    http://codereview.appspot.com/810044/show

    @cjerdonek
    Copy link
    Member

    Thanks. It looks like the issue with the latest patch is caused by side effects of calling importlib.import_module().

    Working from the patch, I got it to the point where inserting the following four lines somewhere in the code--

    try:
        importlib.import_module('foo__doesnotexist')
    except:
        pass
    

    caused the exception raised by the following line--

        module = importlib.import_module('package_foo2.subpackage.no_exist')

    to change from this--

    ...
    File "<frozen importlib._bootstrap>", line 1250, in _find_and_load_unlocked
    ImportError: No module named 'package_foo2.subpackage.no_exist'

    to this--

    ...
    File "..../Lib/importlib/_bootstrap.py", line 1257, in _find_and_load_unlocked
    raise ImportError(_ERR_MSG.format(name), name=name)
    ImportError: No module named 'package_foo2'

    It looks like this issue is cropping up in the tests because the test code dynamically adds packages to directories that importlib may already have examined.

    In the reduced test case I was creating to examine the issue, I found that inserting a call to importlib.invalidate_caches() at an appropriate location resolved the issue.

    Should loadTestsFromName() call importlib.invalidate_caches() in the new patch implementation, or should the test code be aware of that aspect of loadTestsFromName()'s behavior and be adjusted accordingly (e.g. by creating the dynamically-added packages in more isolated directories)? For backwards compatibility reasons, how does loadTestsFromName() currently behave in this regard (i.e. does importlib.import_module() behave the same as __import__ with respect to caching)?

    @bitdancer
    Copy link
    Member

    Thanks for figuring that out. And no, it doesn't matter if it is importlib.load_module or __import__, since both are provided by importlib now and both use the cache.

    It's an interesting question where the cache clear should go. I *think* it should go in the test, based on the idea that the cache is part of the environment, and therefore should be reset by tests that change what's on the path. I'm not sure how we'd write an environment monitor for that, since not all changes to the import cache need to be reset. I wonder if it would be worth putting a reset into DirsOnSysPath.

    @brettcannon
    Copy link
    Member

    Not sure what DirsOnSysPath is, but I have been only calling importlib.invalidate_caches() as needed in order to not slow down tests needlessly.

    And as for detecting an environment change as necessary, that's essentially impossible since it's only needed if something changed between imports which would require adding a hook to notice that an import happened *and* a directory already covered by sys.path_importer_cache (not sys.path since that doesn't cover packages) changed w/o calling invalidate_caches().

    @bitdancer
    Copy link
    Member

    OK, let's just do it in the individual test, then.

    @cjerdonek
    Copy link
    Member

    Because we don't know if the rest of the test code will adhere to this, we might want to consider clearing the cache before each test as well.

    Alternatively, we could avoid having to call importlib.invalidate_caches() at all (and having to think about for which tests it is necessary) if we do each test in a different directory and with a different name for the test package. We could do the former as follows:

        with support.temp_cwd(support.TESTFN):
            dir_name = self.id().split('.')[-1]  # test method name
            with support.temp_cwd(dir_name) as cwd:
                with support.DirsOnSysPath(cwd):
                    # Create package and run test.

    An approach like this might be less prone to issues that are hard to troubleshoot. I verified that it works.

    @bitdancer
    Copy link
    Member

    That would probably be OK, but I don't see why clearing the cache in those same methods (that create directories on the path) would be any harder. (It isn't necessary to clear the cache *afterward*, only before, as far as I can see, since the case of a directory not existing that the cache thinks exists should be handled correctly by importlib).

    @cjerdonek
    Copy link
    Member

    That sounds fine. I just got the sense from above that there was a desire to call invalidate_caches() as few times as possible.

    And yes, I agree only before is necessary. I had just taken what you said above literally (that "[the cache] should be reset by tests that change what's on the path"), thinking that you wanted to maintain the principle that tests should leave things as they were at the beginning.

    @bitdancer
    Copy link
    Member

    Ah, yes, I wasn't clear. Sorry.

    @iElectric
    Copy link
    Mannequin

    iElectric mannequin commented Mar 27, 2013

    What can I do to put this forward? It's still an issue in py2.7

    @voidspace
    Copy link
    Contributor

    My preferred fix is to wrap "an exception during import" as a test that fails instead of an AttributeError. This would definitely be a new feature rather than a bugfix - so it could only be in 3.4.

    It could be made available to Python 2.7 through the unittest2 backport.

    None of the current patches implement my preferred solution yet.

    @iElectric
    Copy link
    Mannequin

    iElectric mannequin commented Mar 27, 2013

    One relevant use case is the following: Pylons/venusian#23

    Here the module is supposed to raise an ImportError.

    @BreamoreBoy
    Copy link
    Mannequin

    BreamoreBoy mannequin commented Jun 30, 2014

    Note that this issue is referred to from bpo-15358.

    @BreamoreBoy
    Copy link
    Mannequin

    BreamoreBoy mannequin commented Jun 30, 2014

    Note that bpo-8297 referenced in msg102236 is closed see changeset d84a69b7ba72.

    @rbtcollins
    Copy link
    Member Author

    I've just put a patch up for the related issue http://bugs.python.org/issue19746

    I'll poke at this one briefly now, since I'm across the related code.

    @rbtcollins
    Copy link
    Member Author

    Ok, here is an implementation that I believe covers everything Michael wanted. I examined the other patches, and can rearrange my implementation to be more like them if desired - but at the heart of this this bug really has two requested changes:

    • deferred reporting of error per Michaels request
    • report missing attributes on packages as an ImportError (if one occurred)

    and thus my implementation focuses on those changes.

    @bitdancer
    Copy link
    Member

    Thanks for tackling this. It's been bugging me almost daily this past week, but as usual when this bug is in my face I had no time to actually work on a fix.

    I applied this patch to default, put an invalid import in test_os, and this is the result:

    rdmurray@pydev:~/python/p35>./python -m unittest test.test_os
    Traceback (most recent call last):
      File "/home/rdmurray/python/p35/Lib/unittest/loader.py", line 140, in loadTestsFromName
        module = __import__(module_name)
      File "/home/rdmurray/python/p35/Lib/test/test_os.py", line 5, in <module>
        import foobar
    ImportError: No module named 'foobar'
    
    During handling of the above exception, another exception occurred:
    
    Traceback (most recent call last):
      File "/home/rdmurray/python/p35/Lib/runpy.py", line 170, in _run_module_as_main
        "__main__", mod_spec)
      File "/home/rdmurray/python/p35/Lib/runpy.py", line 85, in _run_code
        exec(code, run_globals)
      File "/home/rdmurray/python/p35/Lib/unittest/__main__.py", line 18, in <module>
        main(module=None)
      File "/home/rdmurray/python/p35/Lib/unittest/main.py", line 92, in __init__
        self.parseArgs(argv)
      File "/home/rdmurray/python/p35/Lib/unittest/main.py", line 139, in parseArgs
        self.createTests()
      File "/home/rdmurray/python/p35/Lib/unittest/main.py", line 146, in createTests
        self.module)
      File "/home/rdmurray/python/p35/Lib/unittest/loader.py", line 202, in loadTestsFromNames
        suites = [self.loadTestsFromName(name, module) for name in names]
      File "/home/rdmurray/python/p35/Lib/unittest/loader.py", line 202, in <listcomp>
        suites = [self.loadTestsFromName(name, module) for name in names]
      File "/home/rdmurray/python/p35/Lib/unittest/loader.py", line 145, in loadTestsFromName
        next_attribute, self.suiteClass)
    ValueError: need more than 1 value to unpack

    I get similar errors if I misspell the module name in on the command line.

    From my point of view this is still an improvement over the status quo, but I don't think it is what you had in mind :).

    @rbtcollins
    Copy link
    Member Author

    You may need to apply the patch from http://bugs.python.org/issue19746 first as well - I was testing with both applied.

    @bitdancer
    Copy link
    Member

    OK, with both patches applied the output looks good. With a bit of luck I'll have some time to actually review the patches in a couple of hours.

    @rbtcollins
    Copy link
    Member Author

    This is what I see in my tree:

    E
    ======================================================================
    ERROR: test_os (unittest.loader.ModuleImportFailure)
    ----------------------------------------------------------------------

    Traceback (most recent call last):
      File "/home/robertc/work/cpython/Lib/unittest/case.py", line 58, in testPartExecutor
        yield
      File "/home/robertc/work/cpython/Lib/unittest/case.py", line 577, in run
        testMethod()
      File "/home/robertc/work/cpython/Lib/unittest/loader.py", line 36, in testFailure
        raise exception
    ImportError: Failed to import test module: test_os
    Traceback (most recent call last):
      File "/home/robertc/work/cpython/Lib/unittest/loader.py", line 146, in loadTestsFromName
        module = __import__(module_name)
      File "/home/robertc/work/cpython/Lib/test/test_os.py", line 5, in <module>
        import broken
    ImportError: No module named 'broken'

    @rbtcollins
    Copy link
    Member Author

    Raced with your comment. Great - and thanks!

    @rbtcollins
    Copy link
    Member Author

    Patch polished up and updated - ready for review IMO.

    @rbtcollins
    Copy link
    Member Author

    Thanks for the review, updated patch here - I'll let this sit for a day or two for more comments then commit it Monday.

    @rbtcollins
    Copy link
    Member Author

    I've updated the patch to try and address the niggling clarity issues from the review. Please let me know what you think (and if I hear nothing I'll commit it as-is since the review was still ok).

    @python-dev
    Copy link
    Mannequin

    python-dev mannequin commented Oct 29, 2014

    New changeset 708b2e656c1d by Robert Collins in branch 'default':
    Close bpo-7559: ImportError when loading a test now shown as ImportError.
    https://hg.python.org/cpython/rev/708b2e656c1d

    @python-dev python-dev mannequin closed this as completed Oct 29, 2014
    @iElectric
    Copy link
    Mannequin

    iElectric mannequin commented Nov 3, 2014

    Could we backport this one to 3.x and 2.7? It's leads to really bad UX.

    @bitdancer
    Copy link
    Member

    I would love that, but I think the fix depends on a feature. Robert will know for sure.

    @rbtcollins
    Copy link
    Member Author

    Its backported in unittest2 0.8.0 which is available on pypi for 2.6+ and 3.2+.

    The changes are large enough that I'd hesitate to backport them in cPython itself.

    @bitdancer
    Copy link
    Member

    It looks to me like this is complete, so closing.

    @ezio-melotti ezio-melotti transferred this issue from another repository Apr 10, 2022
    Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
    Labels
    easy stdlib Python modules in the Lib dir type-bug An unexpected behavior, bug, or error
    Projects
    None yet
    Development

    No branches or pull requests

    5 participants