web-dev-qa-db-fra.com

Est-ce que deux-points dans les blocs python sont techniquement nécessaires?

C'est vraiment juste une question théorique par un python débutant 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 pour savoir comment fonctionne la syntaxe python - est de savoir si les deux-points sont vraiment inutiles? Devais-je changer la syntaxe python afin que le colon n'est plus nécessaire, est-ce que quelque chose se briserait? Est-ce que cela rendrait certaines déclarations ambiguës ou impossibles?

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é.

9
Phoshi

Le deux-points n'est pas vraiment nécessaire grammaticalement, si Python a é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 langages comme Cobra le font.

La principale raison pour laquelle deux points sont requis dans python est la lisibilité humaine. Pour citer 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)

versus

if a == b:
    print(a)

Remarquez comment le second est légèrement plus facile à lire. Remarquez comment un deux-points déclenche l'exemple dans cette réponse 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 mentionné également dans la FAQ, les deux-points facilitent également le traitement du code python sans analyser complètement la langue. Tout processeur de texte doté d'un analyseur complet, y compris le python compilateur, peut se passer des deux points s'il n'était pas requis ou s'il est rendu facultatif lorsqu'il n'est pas ambigu.

14
Lie Ryan

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

Guido van Rossum (créateur de Python) avait un Python blog d'histoire 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 diverses 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. C'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 peuvent 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.

10
RemcoGerlich

La syntaxe de Cobra Programming Language 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 les deux-points, d'autres modifications de la syntaxe sont nécessaires. Voir, par exemple ce morceau de code de l'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'expressions (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 s'écrire

if x, y

Vous avez besoin d'une manière pour 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 indentation forcée . Seul la suppression des deux points 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 of 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 Design and History FAQ mentionne également que cette décision est basée sur des preuves empiriques du prédécesseur de Python, ABC.

4
Jörg W Mittag