Broken circular import between `threading` and `_threading_local`

Offen
#156,341 11 Kommentare 1 Reaktion 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

Bewertung

Schwierigkeit
4/5
Geschätzter Aufwand
3-5 Tage
Anfängerfreundlichkeit
30/100
Issue-Typ
Bug
Klarheit
Größtenteils klar
Aktivitätsstatus
Veraltet
Tech-Stack
python
Bereich
backend

Rechercherichtung

Lesen Sie Lib/threading.py und Lib/_threading_local.py an den referenzierten Import- und Objekterstellungspunkten. Reproduzieren Sie den Fehler, indem Sie _thread._local vor dem Import von threading löschen, und prüfen Sie anschließend das zugehörige Issue #141460 und den verknüpften PR gh-157042. Als erledigt gilt die Aufgabe, wenn der zirkuläre Import behoben ist und das demonstrierte Fallback-Verhalten durch Regressionstests abgedeckt wird.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Beschreibung

stdlib type-bug

Bug report

Bug description:

The threading module defines local as follows:

https://github.com/python/cpython/blob/ee521e8ac19ad012ebc4e1b3e71b369988a9b9f8/Lib/threading.py#L67-L70

But _threading_local also uses threading as follows:

https://github.com/python/cpython/blob/ee521e8ac19ad012ebc4e1b3e71b369988a9b9f8/Lib/_threading_local.py#L120

This was fine at first, since threading never used thread-local data (the import was near the end). However, this changed in gh-114424:

https://github.com/python/cpython/blob/ee521e8ac19ad012ebc4e1b3e71b369988a9b9f8/Lib/threading.py#L1540-L1542

The _threading_local.local object depends on threading.current_thread(), and this dependency occurs when the object is created:

https://github.com/python/cpython/blob/ee521e8ac19ad012ebc4e1b3e71b369988a9b9f8/Lib/_threading_local.py#L93-L96
https://github.com/python/cpython/blob/ee521e8ac19ad012ebc4e1b3e71b369988a9b9f8/Lib/_threading_local.py#L42-L46

The object is created (and local is imported) before current_thread() is defined. As a result, there is the broken circular import, which can be reproduced as follows:

>>> import _thread
>>> del _thread._local
>>> import threading
Traceback (most recent call last):
  File "/home/user/.local/share/mise/installs/python/3.14.7/lib/python3.14/threading.py", line 67, in <module>
    from _thread import _local as local
ImportError: cannot import name '_local' from '_thread' (unknown location)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<python-input-2>", line 1, in <module>
    import threading
  File "/home/user/.local/share/mise/installs/python/3.14.7/lib/python3.14/threading.py", line 69, in <module>
    from _threading_local import local
  File "/home/user/.local/share/mise/installs/python/3.14.7/lib/python3.14/_threading_local.py", line 120, in <module>
    from threading import current_thread, RLock
ImportError: cannot import name 'current_thread' from partially initialized module 'threading' (most likely due to a circular import) (/home/user/.local/share/mise/installs/python/3.14.7/lib/python3.14/threading.py)

Since the issue has not been reported before, this raises a legitimate question: is the fallback still relevant?

Related: #141460.

CPython versions tested on:

3.13, 3.14

Operating systems tested on:

Linux

Linked PRs
  • gh-157042
Vorherrschende Sprache
Python
Sterne
77.2k
Forks
36k
Ø Merge
1 T. 9 Std.
Gemergte PRs (30 T.)
558

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
  3. Forken Sie das Repository und arbeiten Sie in einem Branch.
  4. Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.

Mehr aus python/cpython

Alle Issues in python/cpython

Ähnliche Issues

Weitere Issues zu Python

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.