fastparse and native parser assign different line numbers to nested subscripts in multi-line type annotations
Dieses Issue hat noch niemand übernommen.
- 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
Erste Schritte
- Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
- Forke das Repository und arbeite in einem Branch.
- Ö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