Bug 2424312 - typing-extensions vendored in setuptools is not compatible with Python 3.15.0a3
Summary: typing-extensions vendored in setuptools is not compatible with Python 3.15.0a3
Keywords:
Status: CLOSED NOTABUG
Alias: None
Product: Fedora
Classification: Fedora
Component: python-setuptools
Version: rawhide
Hardware: Unspecified
OS: Unspecified
unspecified
unspecified
Target Milestone: ---
Assignee: Python Maintainers
QA Contact: Fedora Extras Quality Assurance
URL:
Whiteboard:
Depends On:
Blocks: PYTHON3.15
TreeView+ depends on / blocked
 
Reported: 2025-12-22 15:20 UTC by Karolina Surma
Modified: 2026-02-25 09:08 UTC (History)
6 users (show)

Fixed In Version:
Clone Of:
Environment:
Last Closed: 2026-02-25 09:08:45 UTC
Type: Bug
Embargoed:


Attachments (Terms of Use)


Links
System ID Private Priority Status Summary Last Updated
Github python typing_extensions pull 595 0 None Merged Become robust to things being removed from typing 2025-12-23 21:43:24 UTC

Description Karolina Surma 2025-12-22 15:20:56 UTC
typing-extensions vendored in setuptools is not compatible with Python 3.15.0a3, e.g.:

/usr/lib/python3.15/site-packages/setuptools/_vendor/typing_extensions.py:3641: in <module>
    no_type_check_decorator = typing.no_type_check_decorator

See also: https://github.com/python/typing_extensions/pull/699

Comment 1 Miro Hrončok 2025-12-23 21:43:24 UTC
https://github.com/python/typing_extensions/pull/699 fixes a test

I think it's https://github.com/python/typing_extensions/pull/595 that fixes the runtime issue

---

How does this problem manifest in using setuptools? Does it break everything?

Comment 2 Miro Hrončok 2025-12-23 22:23:40 UTC
Seems like setuptools pretty much does:

if TYPE_CHECKING:
    from typing_extensions import ..


So this should not blow up on runtime at all :/

Comment 3 Karolina Surma 2026-02-04 13:47:21 UTC
python-pytest-tornado's test sute, similar issue happens in python-pytest-freezegun:

_____________________________ test_type_annotation _____________________________

testdir = <Testdir local('/tmp/pytest-of-mockbuild/pytest-0/test_type_annotation0')>

    @pytest.mark.xfail(sys.version_info < (3, 5),
                       reason='Type hints added in Python 3.5')
    def test_type_annotation(testdir):
    
        testdir.makepyfile(
            test_type_annotation="""
                import pytest
                from tornado.ioloop import IOLoop
    
                @pytest.mark.gen_test
                def test_type_attrib(io_loop: IOLoop):
                    pass  # Only check that gen_test works
            """,
        )
    
        # Run tests
        result = testdir.runpytest_inprocess()
    
        # Check tests went off as they should:
>       assert result.ret == 0
E       assert <ExitCode.INTERNAL_ERROR: 3> == 0
E        +  where <ExitCode.INTERNAL_ERROR: 3> = <RunResult ret=3 len(stdout.lines)=0 len(stderr.lines)=70 duration=0.03s>.ret

/builddir/build/BUILD/python-pytest-tornado-0.8.1-build/pytest-tornado-0.8.1/test/test_fixtures.py:60: AssertionError
----------------------------- Captured stderr call -----------------------------
Traceback (most recent call last):
  File "/usr/lib/python3.15/site-packages/_pytest/pytester.py", line 1165, in runpytest_inprocess
    reprec = self.inline_run(*args, **kwargs)
  File "/usr/lib/python3.15/site-packages/_pytest/pytester.py", line 1130, in inline_run
    ret = main([str(x) for x in args], plugins=plugins)
  File "/usr/lib/python3.15/site-packages/_pytest/config/__init__.py", line 156, in main
    config = _prepareconfig(args, plugins)
  File "/usr/lib/python3.15/site-packages/_pytest/config/__init__.py", line 342, in _prepareconfig
    config = pluginmanager.hook.pytest_cmdline_parse(
        pluginmanager=pluginmanager, args=args
    )
  File "/usr/lib/python3.15/site-packages/pluggy/_hooks.py", line 512, in __call__
    return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult)
           ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.15/site-packages/pluggy/_manager.py", line 120, in _hookexec
    return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
           ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.15/site-packages/pluggy/_callers.py", line 167, in _multicall
    raise exception
  File "/usr/lib/python3.15/site-packages/pluggy/_callers.py", line 139, in _multicall
    teardown.throw(exception)
    ~~~~~~~~~~~~~~^^^^^^^^^^^
  File "/usr/lib/python3.15/site-packages/_pytest/helpconfig.py", line 112, in pytest_cmdline_parse
    config = yield
             ^^^^^
  File "/usr/lib/python3.15/site-packages/pluggy/_callers.py", line 121, in _multicall
    res = hook_impl.function(*args)
  File "/usr/lib/python3.15/site-packages/_pytest/config/__init__.py", line 1146, in pytest_cmdline_parse
    self.parse(args)
    ~~~~~~~~~~^^^^^^
  File "/usr/lib/python3.15/site-packages/_pytest/config/__init__.py", line 1527, in parse
    self._preparse(args, addopts=addopts)
    ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.15/site-packages/_pytest/config/__init__.py", line 1412, in _preparse
    self.pluginmanager.load_setuptools_entrypoints("pytest11")
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^
  File "/usr/lib/python3.15/site-packages/pluggy/_manager.py", line 416, in load_setuptools_entrypoints
    plugin = ep.load()
  File "/usr/lib64/python3.15/importlib/metadata/__init__.py", line 216, in load
    module = import_module(self.module)
  File "/usr/lib64/python3.15/importlib/__init__.py", line 88, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
           ~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "<frozen importlib._bootstrap>", line 1303, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1276, in _find_and_load
  File "<frozen importlib._bootstrap>", line 1219, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 491, in _call_with_frames_removed
  File "<frozen importlib._bootstrap>", line 1303, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1276, in _find_and_load
  File "<frozen importlib._bootstrap>", line 1247, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 857, in _load_unlocked
  File "/usr/lib/python3.15/site-packages/_pytest/assertion/rewrite.py", line 186, in exec_module
    exec(co, module.__dict__)
    ~~~~^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.15/site-packages/setuptools/_vendor/typeguard/__init__.py", line 4, in <module>
    from ._checkers import TypeCheckerCallable as TypeCheckerCallable
  File "<frozen importlib._bootstrap>", line 1276, in _find_and_load
  File "<frozen importlib._bootstrap>", line 1247, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 857, in _load_unlocked
  File "/usr/lib/python3.15/site-packages/_pytest/assertion/rewrite.py", line 186, in exec_module
    exec(co, module.__dict__)
    ~~~~^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.15/site-packages/setuptools/_vendor/typeguard/_checkers.py", line 38, in <module>
    import typing_extensions
  File "/usr/lib/python3.15/site-packages/setuptools/_vendor/typing_extensions.py", line 3641, in <module>
    no_type_check_decorator = typing.no_type_check_decorator
                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib64/python3.15/typing.py", line 3881, in __getattr__
    raise AttributeError(f"module {__name__!r} has no attribute {attr!r}")
AttributeError: module 'typing' has no attribute 'no_type_check_decorator'

Comment 4 Karolina Surma 2026-02-25 08:16:37 UTC
I keep seeing it around, the more I look at it, the weirder it seems to me that there's an attempt to import typing_extensions from setuptools.

python-binary-manager:

Check import: binman.etype.ti_board_config
Traceback (most recent call last):
  File "/usr/lib/rpm/redhat/import_all_modules.py", line 106, in import_modules
    importlib.import_module(module)
    ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^
  File "/usr/lib64/python3.15/importlib/__init__.py", line 88, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
           ~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "<frozen importlib._bootstrap>", line 1311, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1276, in _find_and_load
  File "<frozen importlib._bootstrap>", line 1247, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 857, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 747, in exec_module
  File "<frozen importlib._bootstrap>", line 491, in _call_with_frames_removed
  File "/builddir/build/BUILD/python-binary-manager-0.0.6-build/BUILDROOT/usr/lib/python3.15/site-packages/binman/etype/ti_board_config.py", line 14, in <module>
    from jsonschema import validate
  File "/usr/lib/python3.15/site-packages/jsonschema/__init__.py", line 13, in <module>
    from jsonschema._format import FormatChecker
  File "/usr/lib/python3.15/site-packages/jsonschema/_format.py", line 11, in <module>
    from jsonschema.exceptions import FormatError
  File "/usr/lib/python3.15/site-packages/jsonschema/exceptions.py", line 15, in <module>
    from referencing.exceptions import Unresolvable as _Unresolvable
  File "/usr/lib/python3.15/site-packages/referencing/__init__.py", line 5, in <module>
    from referencing._core import Anchor, Registry, Resource, Specification
  File "/usr/lib/python3.15/site-packages/referencing/_core.py", line 12, in <module>
    from typing_extensions import TypeVar
  File "/usr/lib/python3.15/site-packages/setuptools/_vendor/typing_extensions.py", line 3641, in <module>
    no_type_check_decorator = typing.no_type_check_decorator
                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib64/python3.15/typing.py", line 3912, in __getattr__
    raise AttributeError(f"module {__name__!r} has no attribute {attr!r}")
AttributeError: module 'typing' has no attribute 'no_type_check_decorator'

referencing has this bit in _core.py:

try:
    from typing_extensions import TypeVar
except ImportError:  # pragma: no cover
    from typing import TypeVar

and this in pyproject.toml's dependencies:
  "typing-extensions>=4.4.0; python_version<'3.13'",

Accidentally, typing_extensions can be imported, and that causes ruckus.

Comment 5 Karolina Surma 2026-02-25 08:20:47 UTC
And it's all moot: the core issue is that I wasn't successful in building the newest setuptools in Copr. Once that's working, this issue will disappear, since it stopped vendoring typing_extensions.


Note You need to log in before you can comment on or make changes to this bug.