54 votes

Pourquoi n'est-ce pas une erreur de syntaxe en python?

Remarqué dans notre base de code aujourd'hui, j'ai pensé que sûrement aurais pas pu le construire avec erreur de syntaxe, mais les tests étaient de passage donc, apparemment, il était en fait python valide (dans les deux 2.x et 3).

Les espaces sont parfois pas nécessaire dans l'expression conditionnelle:

>>> 1if True else 0
1

Il ne fonctionne pas si le membre de GAUCHE est une variable:

>>> x = 1
>>> xif True else 0
  File "<stdin>", line 1
    xif True else 0
           ^
SyntaxError: invalid syntax

Mais il ne semble pas encore fonctionner avec d'autres types de littéraux:

>>> {'hello'}if False else 'potato'
'potato'

Ce qui se passe ici, c'est intentionnellement une partie de la grammaire pour une raison quelconque? Est-ce étrange caprice connu/comportement documenté?

66voto

poke Points 64398

L'espace entre les jetons

Sauf au début d'une ligne logique ou dans les littéraux de chaîne, les espaces les espaces, tabulations et de saut peuvent être utilisés de façon interchangeable pour séparer les jetons. Une espace est nécessaire entre les deux jetons seulement si leur enchaînement, sinon, pourrait être interprété comme un autre jeton (par exemple, ab est qu'un pion, mais un b est deux jetons).

Donc dans ce cas, 1if n'est pas un jeton valide, de sorte que l'espace est facultatif. L' 1 est interprété comme un entier littéral de ce qui l' if n'est pas une partie. Donc, if est interprétée séparément et reconnu comme un mot-clé.

En xif cependant, un identifiant est reconnu, si Python n'est pas en mesure de voir que vous avez voulu faire x if - il.

4voto

chepner Points 54078

Le Python lexer génère deux jetons pour l'entrée 1if: integer 1 et le mot-clé if, car aucun jeton qui commence par un chiffre peut contenir la chaîne de caractères if. xif, sur l'autre main, est reconnu comme l'un identificateur valide; il n'y a aucune raison de croire que c'est un identificateur suivi d'un mot clé, et est donc passé à l'analyseur comme un seul jeton.

3voto

Brandon Buck Points 3353

Avec mes connaissances limitées de la transformation lexicale et les jetons, je dirais ce que vous voyez n'est que tout élément qui peut être lexicale analysée comme "différents" (c'est à dire des nombres/les dictionnaires, etc...) à partir de l' if sont en train d'être fait. La plupart des langues ignorer les espaces et j'imagine que Python fait la même chose (à l'exception, bien sûr, des niveaux d'indentation). Une fois les jetons sont générés lors de la grammaire elle-même ne se soucie pas, il est probable qu'il cherche une [EXPRESSION] [IF] [EXPRESSION] [ELSE] [EXPRESSION] groupement, qui, encore une fois avec vos exemples, marcherait bien.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X