python / python/cpython

Improving various error messages

Ouverte
#135,975 4 commentaires 1 réaction 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

interpreter-core topic-parser type-feature
Langage dominant
Python
Étoiles
77.2k
Forks
35.9k
Métriques de merge des PR
Métriques de PR en attente

Description

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

Guide de contribution

Ouvrir le guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Piste de recherche

L’issue ne nomme aucun fichier ni test ; commencez par reproduire les exemples de syntaxe indiqués dans Python 3.13.5 et suivre où sont produits leurs messages SyntaxError. Le travail est terminé lorsqu’un accord est trouvé sur les cas soulevés par les questions ouvertes et que les messages proposés sont mis à jour de manière cohérente dans les scénarios indiqués d’expressions étoilées et d’importations.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
python
Domaine
compilers
Type d'issue
Fonctionnalité
Difficulté
4/5
Temps estimé
3-5 jours
Activité
À l'abandon
Clarté
Plutôt claire
Accessibilité débutants
35/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.