GeezerVison is showing github.com — 3.13.0b3 regression: inspect.signature + unittest.mock · Issue #121257 · python/cpython
3.13.0b3 regression: inspect.signature + unittest.mock #121257DescriptionBug 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 Activitychanged the title [-]3.13.0b3 regression: [/-] [+]3.13.0b3 regression: inspect.signature + unittest.mock[/+] on Jul 2, 2024picnixz commented on Jul 2, 2024 neutrinoceros commented on Jul 2, 2024 ContributorAuthor More actions Thank you ! It's definitely related: the test pass if I revert just the bit you pointed to. picnixz commented on Jul 2, 2024 serhiy-storchaka commented on Jul 2, 2024 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 commented on Jul 2, 2024 ContributorAuthor More actions 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.
MetadataMetadataDevelopmentNo branches or pull requestsIssue actions
|