8000 3.13.0b3 regression: inspect.signature + unittest.mock · Issue #121257 · python/cpython · GitHub
[go: up one dir, main page]

Skip to content

3.13.0b3 regression: inspect.signature + unittest.mock #121257

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

Closed
neutrinoceros opened this issue Jul 2, 2024 · 5 comments
Closed

3.13.0b3 regression: inspect.signature + unittest.mock #121257

neutrinoceros opened this issue Jul 2, 2024 · 5 comments
Labels
3.13 bugs and security fixes 3.14 bugs and security fixes type-bug An unexpected behavior, bug, or error

Comments

@neutrinoceros
Copy link
Contributor
neutrinoceros commented Jul 2, 2024

Bug report

Bug description:

MRE:

import inspect
import functools
from unittest import TestCase
import unittest.mock as mk

class TestIsinstance(TestCase):
    def test_mk(self):
        def foo(): pass
        with mk.patch.object(functools, "partial", autospec=True):
            inspect.signature(foo)

fails with

E
======================================================================
ERROR: test_mk (test.TestIsinstance.test_mk)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/private/tmp/reprod/test.py", line 10, in test_mk
    inspect.signature(foo)
    ~~~~~~~~~~~~~~~~~^^^^^
  File "/Users/clm/.pyenv/versions/3.13.0b3/lib/python3.13/inspect.py", line 3333, in signature
    return Signature.from_callable(obj, follow_wrapped=follow_wrapped,
           ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                                   globals=globals, locals=locals, eval_str=eval_str)
                                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/clm/.pyenv/versions/3.13.0b3/lib/python3.13/inspect.py", line 3059, in from_callable
    return _signature_from_callable(obj, sigcls=cls,
                                    follow_wrapper_chains=follow_wrapped,
                                    globals=globals, locals=locals, eval_str=eval_str)
  File "/Users/clm/.pyenv/versions/3.13.0b3/lib/python3.13/inspect.py", line 2559, in _signature_from_callable
    if isinstance(obj, functools.partial):
       ~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: isinstance() arg 2 must be a type, a tuple of types, or a union

----------------------------------------------------------------------
Ran 1 test in 0.002s

FAILED (errors=1)

reproduces locally and in CI: example logs

this test case is adapted from a real life application in astropy's test suite, which has been stable since at least Python 3.8

CPython versions tested on:

3.8, 3.9, 3.10, 3.11, 3.12, 3.13

Operating systems tested on:

Linux, macOS, Windows

@neutrinoceros neutrinoceros added the type-bug An unexpected behavior, bug, or error label Jul 2, 2024
@neutrinoceros neutrinoceros changed the title 3.13.0b3 regression: 3.13.0b3 regression: inspect.signature + unittest.mock Jul 2, 2024
@picnixz
Copy link
Member
picnixz commented Jul 2, 2024

@neutrinoceros
Copy link
Contributor Author

Thank you ! It's definitely related: the test pass if I revert just the bit you pointed to.

@picnixz
Copy link
Member
picnixz commented Jul 2, 2024

cc @serhiy-storchaka

@Eclips4 Eclips4 added 3.13 bugs and security fixes 3.14 bugs and security fixes labels Jul 2, 2024
@serhiy-storchaka
Copy link
Member

It is not safe to patch functools.partial which is used in the inspect module and then use the inspect module.

Add the following code in your example and you will see that it was broken before #121092.

            inspect.signature(self.test_mk)
            def bar(x: int) -> None: pass
            inspect.get_annotations(bar, eval_str=True)

@neutrinoceros
Copy link
Contributor Author

Thanks for pointing this out !
I was able to resolve this on our side by avoiding mocking altogether at astropy/astropy#16659
Feel free to close this issue.

@serhiy-storchaka serhiy-storchaka closed this as not planned Won't fix, can't repro, duplicate, stale Jul 2, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
3.13 bugs and security fixes 3.14 bugs and security fixes type-bug An unexpected behavior, bug, or error
Projects
None yet
Development

No branches or pull requests

4 participants
0