symtable: a name read only inside an inlined comprehension is not marked as referenced (3.12+)
I maintainer di solito rispondono entro 1 giorno
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Idoneità per principianti
- 35/100
Direzione di ricerca
Start with the symtable handling of inlined comprehensions and the related changes in gh-109292 and gh-124697. Run the reproduction across Python 3.12 and 3.14, then compare the symbol table output with the expected reference for k in f. Done means the enclosing function reports the read or symtable exposes it another way, with tests covering the behavior.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Bug report
Bug description
Since PEP 709 (3.12), symtable no longer creates a child table for a list, set or dict comprehension. The 3.12
What's New says the comprehension's locals now appear in the enclosing function's table (gh-109292).
However, a name from the enclosing scope that is read only inside the inlined comprehension is no longer marked
as referenced in the enclosing function's table, and no child table records the read either. The read becomes
invisible to symtable users. On 3.9 (and, as far as I know, up to 3.11), the read appears in the comprehension's own
listcomp table. Generator expressions, which are still separate scopes, are unaffected.
Reproduction:
"""Minimal reproduction: since PEP 709 (Python 3.12), a name read only inside an inlined list comprehension is not
marked as referenced in the enclosing function's symbol table, and no child table holds it either.
Run with several interpreters: python3.9 shows the read (in a 'listcomp' child table); 3.12 and 3.14 lose it."""
import symtable, sys
SRC = '''
def f(xs, k):
return [x + k for x in xs] # list comprehension: inlined since 3.12
def g(xs, k):
return list(x + k for x in xs) # generator expression: still its own scope
'''
def report():
top = symtable.symtable(SRC, "<repro>", "exec")
for fn in top.get_children():
if fn.get_name() not in ("f", "g"):
continue # skip implicit scopes such as __annotate__ (3.14)
k = fn.lookup("k")
children = {c.get_name(): sorted(s.get_name() for s in c.get_symbols() if s.is_referenced())
for c in fn.get_children()}
print(f"{sys.version.split()[0]} {fn.get_name()}: k.is_referenced() = {k.is_referenced()}; "
f"child tables (referenced names) = {children}")
if __name__ == "__main__":
report()
Output (macOS; CPython 3.9.6, 3.12.12, 3.14.7):
3.9.6 f: k.is_referenced() = False; child tables (referenced names) = {'listcomp': ['k', 'x']}
3.9.6 g: k.is_referenced() = False; child tables (referenced names) = {'genexpr': ['k', 'x']}
3.12.12 f: k.is_referenced() = False; child tables (referenced names) = {}
3.12.12 g: k.is_referenced() = False; child tables (referenced names) = {'genexpr': ['k', 'x']}
3.14.7 f: k.is_referenced() = False; child tables (referenced names) = {}
3.14.7 g: k.is_referenced() = False; child tables (referenced names) = {'genexpr': ['k', 'x']}
Expected: in f, k.is_referenced() should be True, since k is read in f's body now that the comprehension
is part of f's scope. Alternatively, symtable should expose the inlined comprehension's references some other way.
Impact: tools that use symtable to find unused parameters or variables, or dead code, get false "unused"
results. In a scan of 35,562 function scopes, this caused 1,885 false disagreements against the compiled bytecode.
Related: gh-109292 (the documentation of the PEP 709 change to symtable); gh-124697 (refactoring of inlined
comprehensions), which may already fix this on main. I have not tested 3.15 / main.
CPython versions tested on:
3.12, 3.14
Operating systems tested on:
macOS
Linked PRs
- gh-160413
- gh-160457
- Lingua principale
- Python
- Stelle
- 77.7k
- Fork
- 38.3k
- Merge medio
- 13h 30m
- PR unite (30g)
- 708
Preparare l'ambiente
Avvia il container di sviluppo del progetto nel browser, con il tuo account GitHub.
- Nessun Dockerfile né file Docker Compose
- Ha un modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di python/cpython
-
tarfile: extractfile(member).read() of a sparse member is slow due to repeated bytes concatenationApertaperformance stdlib
Difficoltà 2/5 1-3 ore Idoneità per principianti 75/100
I maintainer di solito rispondono entro 1 giorno
-
tests topic-profiling type-bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
python/cpython#160334 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
`iso2022_jp_3` encodes U+9B1D but decodes the result as U+9B1CForse già presa @kinqsradio l’ha presa 2 giorni fa. Apertaextension-modules type-bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 84/100
I maintainer di solito rispondono entro 1 giorno
-
Remove unused FVS_* macrosApertainterpreter-core type-feature
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 78/100
python/cpython#160109 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
extension-modules type-bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
python/cpython#160001 · 3 commenti ·
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di python/cpython
Issue simili
-
enhancement
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
glossyio/traffic-monitor#264 ·
I maintainer di solito rispondono entro 1 giorno
-
Add self-hostAperta
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 75/100
Atarity/deploy-your-own-saas#102 ·
-
[Bug]: RDFlex silently drops the covariate adjustment when the outcome or treatment column is integer-typedForse già presa @vrjdev l’ha presa oggi. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
DoubleML/doubleml-for-py#424 ·
I maintainer di solito rispondono entro 1 giorno
-
agentic-dmx docs enhancement
Difficoltà 1/5 1-3 ore Idoneità per principianti 86/100
-
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 72/100
521xueweihan/HelloGitHub#4150 ·