python / python/cpython

Improving various error messages

オープン
#135,975 コメント 4 件 リアクション 1 件 担当者 0 名 GitHub で見る

まだ誰も着手していません。

interpreter-core topic-parser type-feature
主要言語
Python
スター
77.2k
フォーク
35.9k
PR マージ指標
PR 指標を取得中

説明

Feature or enhancement

Proposal:

I propose improving the error messages as follows:

Starred expression

In the return type type hint

In Python 3.13.5:

>>> def func() -> *list:
  File "<python-input-0>", line 1
    def func() -> *list:
               ^^
SyntaxError: expected ':'

Proposed:

>>> def func() -> *list:
  File "<python-input-0>", line 1
    def func() -> *list:
                  ^^^^^
SyntaxError: can't use starred expression in the return type type hint
When unpacking to a set

In Python 3.13.5:

>>> {*x, y} = 1, 2
  File "<python-input-0>", line 1
    {*x, y} = 1, 2
    ^^^^^^^
SyntaxError: cannot assign to set display here. Maybe you meant '==' instead of '='?

Proposed:

>>> {*x, y} = 1, 2
  File "<python-input-0>", line 1
    {*x, y} = 1, 2
    ^^^^^^^
SyntaxError: starred assignment target must be in a list or tuple, not a set. Maybe you meant '==' instead of '='?
In type statement

In Python 3.13.5:

>>> type *Z = int
  File "<python-input-0>", line 1
    type *Z = int
    ^^^^^^^
SyntaxError: cannot assign to expression here. Maybe you meant '==' instead of '='?
>>> type Z = *int
  File "<python-input-1>", line 1
    type Z = *int
             ^
SyntaxError: invalid syntax

Proposed:

>>> type *Z = int
  File "<python-input-0>", line 1
    type *Z = int
         ^^
SyntaxError: cannot use starred expression in a type statement
>>> type Z = *int
  File "<python-input-1>", line 1
    type Z = *int
             ^^^^
SyntaxError: cannot use starred expression in a type statement
Assign to None/True/False

In Python 3.13.5:

>>> *None, _ = (1, 2)
  File "<python-input-1>", line 1
    *None, _ = (1, 2)
           ^^^^^^^^^^
SyntaxError: invalid syntax. Maybe you meant '==' or ':=' instead of '='?

Proposed:

>>> *None, _ = (1, 2)
  File "<python-input-1>", line 1
    *None, _ = (1, 2)
    ^^^^^
SyntaxError: cannot assign to None

(Same for True/False)

import statement

In Python 3.13.5:

>>> from typing import *, Any
  File "<python-input-0>", line 1
    from typing import *, Any
                        ^
SyntaxError: invalid syntax

Proposed:

>>> from typing import *, Any
  File "<python-input-0>", line 1
    from typing import *, Any
                       ^^^^^^
SyntaxError: can't use wildcard and identifier at the same time

Open questions:

"You don't need to use a starred expression here"?

In Python 3.13.5:

>>> lst = [1, 2, 3]
>>> a, b, c = *lst
  File "<python-input-1>", line 1
    a, b, c = *lst
              ^^^^
SyntaxError: can't use starred expression here

This is a tricky one. In my experience, this exists in many beginner codes, but I don't know how we can improve the error message here. The word "here" is very unclear IMHO.

Inconsistency of error messages

In Python 3.13.5:

>>> for *x in [[0]]: print(x)
  File "<python-input-0>", line 1
    for *x in [[0]]: print(x)
        ^^
SyntaxError: starred assignment target must be in a list or tuple
>>> for (*x) in [[0]]: print(x)
  File "<python-input-1>", line 1
    for (*x) in [[0]]: print(x)
         ^^
SyntaxError: cannot use starred expression here

I find the above inconsistency a little bit surprising, but I don't have a strong feeling about this.

Has this already been discussed elsewhere?

This is a minor feature, which does not need previous discussion elsewhere

Links to previous discussion of this feature:

No response

コントリビューションガイド

コントリビューションガイドを開く

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

調査の方向性

この issue ではファイルやテストが指定されていないため、まず Python 3.13.5 で記載された構文例を再現し、それらの SyntaxError メッセージがどこで生成されるかを追跡します。完了の条件は、未解決の問いに関するケースについて合意し、記載された starred-expression と import の各シナリオ全体で提案されたメッセージを一貫して更新することです。

索引モデルが issue の本文から書いたものです。

評価

技術スタック
python
領域
compilers
issue の種類
機能追加
難易度
4/5
見積もり時間
3〜5日
活発さ
停滞
明瞭さ
おおむね明確
初心者へのやさしさ
35/100

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。