Le côlon dans les blocs python est-il techniquement nécessaire?

19

C'est vraiment juste une question théorique d'un débutant en python qui veut en savoir plus.

J'oublie toujours les deux points après les instructions initiales de bloc en python. Voilà ce que je veux dire:

  • for <variable> in <sequence>:
  • if <blah blah>:

Ma pensée est qu'une des raisons que j'oublie toujours, c'est qu'elles sont de facto implicites: deux points ou pas, la déclaration se termine par cette ligne.

Ma question - que je pose afin d'apprendre comment fonctionne la syntaxe python - est de savoir si les deux points sont vraiment inutiles? Si je devais changer la syntaxe python pour que les deux-points ne soient plus nécessaires, quelque chose se briserait-il? Cela rendrait-il certaines déclarations ambiguës ou impossibles?

Tomáš Zato - Réintégrer Monica
la source
4
Je pense que vous ne comprenez pas la question, qui est de savoir si les deux-points sont nécessaires pour que la syntaxe fonctionne. Aussi, quelle que soit votre réponse, elle doit également contenir une explication.
Tomáš Zato - Rétablir Monica le
Probablement, pouvez-vous reformuler des parties de la question, afin que je puisse bénéficier de votre compréhension de cette question, peut-être un exemple? Vous seriez le meilleur juge, je pense que je n'ai aucune idée de votre intention de demander. Voulez-vous dire au niveau de l'analyseur interprète / compilateur? Merci beaucoup.
bhan le
Je ne sais pas comment l'exprimer mieux. Ma question est fondamentalement, si vous pouviez changer toute la syntaxe python de sorte qu'il n'a plus besoin de deux points après if, else, whileet ainsi de suite. Si vous faisiez cela, le python serait-il toujours un langage qui peut être utilisé sans ambiguïté?
Tomáš Zato - Rétablir Monica le
Je l'ai! C'est une question autour des décisions de conception de la syntaxe de python . Désolé, je l'ai mal compris. Merci d'avoir expliqué.
bhan le
Spéculer. C'est comme si les sauts de ligne étaient plus difficiles à détecter par les interprètes / analyseurs dans la pratique ou étaient là pour la lisibilité. Dans LUA, vous pouvez écrire if .. then .. endsur une seule ligne. Donc ici en python thenest substitué par deux choses a :et une nouvelle ligne obligatoire. L'un d'eux semble redondant.
bhan le

Réponses:

9

Oui, les deux points sont nécessaires pour lever l'ambiguïté de certaines constructions. Considérez, par exemple if x - y < z: pass,. Sans les deux points, nous ne pouvons pas décider comment analyser cela sans connaître le contexte de ce que sont x, y et z.if x: -y < z...est valide si x est booléen, if x - y < z:est valide sinon.

Comme c'est une très bonne idée pour une langue de programmation de ne pas vous obliger à exécuter une application jusqu'au point que vous compilez pour pouvoir l'analyser, les deux-points sont très nécessaires. Vous pourriez le laisser tomber, mais vous auriez besoin d'autres façons de lever l'ambiguïté.

Phoshi
la source
1
Attendez, vous pouvez avoir une déclaration après les deux points sur la même ligne? J'étais presque sûr que ce n'était pas permis.
Tomáš Zato - Rétablir Monica le
1
Il est autorisé, mais uniquement après un saut de ligne.
Phoshi
Encore un peu confus. Est-ce autorisé: if condition: print("Condition passed")\nautorisé? Le \nsymbolise la nouvelle ligne après l'instruction print.
Tomáš Zato - Rétablir Monica le
Bien sûr, essayez-le.
RemcoGerlich
1
@TomasZato: oui, vous pouvez avoir des déclarations après les deux points. Il termine immédiatement le bloc, il est donc principalement utile lorsque le bloc est un petit revêtement.
Lie Ryan
14

Le deux-points n'est pas vraiment nécessaire grammaticalement, si Python avait été conçu dans un monde différent, il est tout à fait concevable que le concepteur de langage ne décide pas d'exiger le deux-points. Et en effet, des langues comme Cobra le font.

La principale raison pour laquelle deux points sont requis en python est la lisibilité humaine. Pour citer la FAQ Python :

Pourquoi les deux-points sont-ils requis pour les instructions if / while / def / class?

Le côlon est principalement nécessaire pour améliorer la lisibilité (l'un des résultats du langage expérimental ABC). Considère ceci:

if a == b
    print(a)

contre

if a == b:
    print(a)

Remarquez comment le second est légèrement plus facile à lire. Remarquez en outre comment un deux-points déclenche l'exemple dans cette réponse à la FAQ; c'est une utilisation standard en anglais.

Une autre raison mineure est que les deux points facilitent la tâche des éditeurs grâce à la coloration syntaxique; ils peuvent rechercher des deux-points pour décider quand l'indentation doit être augmentée au lieu d'avoir à effectuer une analyse plus élaborée du texte du programme.

Comme également mentionné dans la FAQ, les deux points facilitent également le traitement du code python sans analyser complètement le langage. Tout processeur de texte doté d'un analyseur à part entière, y compris le compilateur python, peut se passer des deux points s'il n'était pas requis ou s'il est rendu facultatif lorsqu'il n'est pas ambigu.

Lie Ryan
la source
3
«Remarquez comment le second est légèrement plus facile à lire.» Je trouve le premier plus facile à lire. Moins de bruit.
user76284
10

Ce n'est pas nécessaire pour l'ordinateur, mais pour les humains.

Guido van Rossum (créateur de Python) avait un blog d'histoire Python pendant un certain temps. Le deux-points a été introduit dans ABC , la source de nombreuses fonctionnalités de Python.

Dans ce billet de blog sur "Karin Dewar, l'indentation et le colon" , Guido écrit:

Et ici, je vais paraphraser, à la demande de Lambert.

En 1978, lors d'une session de conception dans un manoir à Jabłonna (Pologne), Robert Dewar, Peter King, Jack Schwartz et Lambert comparaient différentes syntaxes alternatives proposées pour B, en comparant des implémentations de tri à bulles (buggy) écrites dans chaque alternative. Comme ils ne pouvaient pas s'entendre, la femme de Robert Dewar a été appelée de sa chambre et a demandé son avis, comme un Paris moderne a demandé de comparer la beauté d'Héra, Athéna et Aphrodite. Mais après que la première version lui ait été expliquée, elle a fait la remarque suivante: "Vous voulez dire, dans la ligne où il est dit:" POUR i ... ", que cela doit être fait pour les lignes qui suivent; pas seulement pour cette ligne? ! " Et ici, les scientifiques ont réalisé que le malentendu aurait été évité s'il y avait eu un colon à la fin de cette ligne.

( B voici une série de langages prototypes B0, B1, ... qui ont conduit à ABC. Ce n'est pas le langage B qui est le prédécesseur de C).

Je me souviens aussi que Guido avait souligné dans les années 90 que c'était pour le bénéfice des éditeurs , qui pouvaient automatiquement insérer un tiret après une ligne qui se termine par deux points. Mais je n'ai pas encore trouvé de source pour cela.

RemcoGerlich
la source
4

La syntaxe du langage de programmation Cobra est fortement inspirée de celle de Python, et elle supprime les deux points, il semble donc que ce ne soit pas strictement nécessaire. Cependant, il ne suffit pas de supprimer simplement les deux-points, d'autres modifications de la syntaxe sont nécessaires. Voir, par exemple, ce morceau de code d'un de mes projets de jouets :

kons  = lambda hd, tl: lambda x: hd if x else tl
virst = lambda l: l(True )
rrest = lambda l: l(False)

Sans les deux points pour séparer le corps de la liste des paramètres, je devrais utiliser l'indentation:

kons  = lambda hd, tl
    lambda x
        hd if x else tl

virst = lambda l
    l(True )

rrest = lambda l
    l(False)

Je crois que les versions antérieures de Cobra rendaient le deux-points facultatif, vous pouviez utiliser soit l'indentation, soit un deux-points, soit les deux. Semblable à la façon dont cela fonctionne dans Ruby, où il existe des mots clés pour séparer les différentes parties des expressions de contrôle, mais vous pouvez également utiliser des séparateurs d'expression (point-virgule ou nouvelle ligne):

# idiomatic
while true do puts "I am awesome" end
#          ↑↑

# non-idiomatic, but legal
while true; puts "I am awesome" end
#         ↑

# non-idiomatic, but legal
while true
puts "I am awesome" end

# idiomatic
while true
  puts "I am awesome"
end

Dans les versions actuelles de Cobra, vous pouvez utiliser une virgule:

if x
    y

peut être écrit comme

if x, y

Vous avez besoin d' un moyen de séparer les différentes parties des expressions ou définitions de contrôle. En Python, c'est le colon. Si vous supprimez les deux points, vous devez le remplacer par autre chose, par exemple une indentation forcée . Seul le retrait du côlon ne fonctionnera pas.

La seule façon d'être absolument sûr est de formaliser la syntaxe avec et sans deux points et de prouver sa non-ambiguïté.

Notez, cependant, que l'un des aphorismes du Zen de Python est "Explicit is better than Implicit", donc la délimitation explicite des blocs avec deux-points semble correspondre à la philosophie générale de Python. La FAQ sur la conception et l'histoire mentionne également que cette décision est basée sur des preuves empiriques du prédécesseur de Python, ABC.

Jörg W Mittag
la source
3
Eh bien, avec cette philosophie décrite dans le dernier paragraphe, vous pourriez avoir besoin de deux points à la fin de chaque ligne. Explicite vs implicite n'a de sens que si explicite ajoute réellement des informations (par exemple, la variante implicite est ambiguë). Quel était le point de ma question.
Tomáš Zato - Rétablir Monica le