python / python/mypy

fastparse and native parser assign different line numbers to nested subscripts in multi-line type annotations

Offen
#21,480 3 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

bug
Vorherrschende Sprache
Python
Sterne
20.6k
Forks
3.3k
PR-Merge-Kennzahlen
PR-Kennzahlen ausstehend

Beschreibung

Bug Report

For a multi-line type annotation containing an error in a nested subscript, fastparse and nativeparse assign different line numbers to the resulting UnboundType. fastparse uses the outermost annotation line (self.line fixed at TypeConverter construction); nativeparse uses the actual per-node source line. Downstream, type-arg / arity errors reported against that node show up on different lines depending on which parser was used.

I ran into this as # type: ignore comments in serial mode became unused-ignore when trying parallel mode due to the line number difference.

To Reproduce

producer.py:

def foo() -> dict[
    str,
    dict[int, int, int],
]:
    return {}

mypy.ini:

[mypy]
python_version = 3.12
rm -rf .mypy_cache && mypy --num-workers=0 producer.py                       # fastparse
rm -rf .mypy_cache && mypy --num-workers=0 --native-parser producer.py        # nativeparse, no workers

Expected Behavior

Both parsers should agree on the reported line — either both line 1 (outer annotation) or both line 3 (inner offending node).

Actual Behavior

invocation reported line
--num-workers=0 (fastparse, no native-parser) 1 (outer dict[)
--num-workers=0 --native-parser 3 (inner dict[int, int, int])

Same error in both: "dict" expects 2 type arguments, but 3 given [type-arg].

Bisection notes:

  • The divergence requires the error-bearing node to be a nested sub-expression. Top-level multi-line wrong-arity (x: (\n dict[str, str, str]\n ) = {}) reports line 1 in both parsers.
  • Single-line wrong-arity has nothing to diverge on; both parsers agree.

Your Environment

  • Mypy version used: 2.1.0 (PyPI). Also reproduces on current master (2.2.0+dev.e53693be05a2).
  • Mypy command-line flags: --native-parser selects the inner-line behavior; default (--num-workers=0, no --native-parser`) selects the outer-line behavior.
  • Mypy configuration: python_version = 3.12.
  • Python version used: 3.12.13

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Rechercherichtung

Beginnen Sie mit den fastparse- und nativeparse-Pfaden rund um TypeConverter. Verwenden Sie dabei das Beispiel producer.py und die bereitgestellten mypy-Befehle, um die unterschiedlichen Zeilen zu reproduzieren. Verfolgen Sie, wie Quellzeilen verschachtelter Subscripts zu UnboundType-Positionen werden, und überprüfen Sie anschließend, dass beide Parser dieselbe Zeile melden und das Verhalten von type-arg-Fehler und type-ignore konsistent bleibt.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
python
Bereich
compilers, devtools
Issue-Typ
Bug
Schwierigkeit
4/5
Geschätzter Aufwand
3-5 Tage
Aktivitätsstatus
Ruhig
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
52/100

Neue Issues direkt in Ihr Postfach

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