197 votes

Pourquoi le point-virgule est-il autorisé dans ce snippet python ?

Python ne garantit pas l'utilisation de points-virgules pour terminer les déclarations. Alors pourquoi ceci (ci-dessous) est-il autorisé ?

import pdb; pdb.set_trace()

3 votes

Notez que ce code est manifestement destiné à des fins de débogage uniquement et qu'il sera vraisemblablement supprimé avant d'être "terminé". J'utilise cet extrait tel que vous le présentez afin de pouvoir le déplacer facilement.

0 votes

Lol Je suis venu à cette question à partir du même site web : realpython.com/python-debugging-pdb

274voto

André Caron Points 19543

Python ne exiger les points-virgules pour terminer les déclarations. Points-virgules peut peut être utilisé pour délimiter les déclarations si vous souhaitez placer plusieurs déclarations sur la même ligne.

Maintenant, pourquoi Est-ce que c'est autorisé ? Il s'agit d'une simple décision de conception. Je ne pense pas que Python ait besoin de ce point-virgule, mais quelqu'un a pensé que ce serait agréable à avoir et l'a ajouté au langage.

20 votes

C'est utile pour des choses comme timeit a = 5; a*a

16 votes

Il semble utile pour les instructions exec, par exemple exec('for a in [1,2,3]:print a;print a+1')

90 votes

Je suis venu à Python avec une expérience en C, Obj-C, Javascript, PHP. Je mets fréquemment un terminateur (inutile) ; à la fin d'une ligne. Mais heureusement, Python me pardonne

67voto

chown Points 25161

http://docs.python.org/reference/compound_stmts.html

Les déclarations composées se composent d'une ou plusieurs "clauses". Une clause se compose d'un en-tête et d'une "suite". Les en-têtes de clause d'une particulière sont tous au même niveau d'indentation. Chaque en-tête de clause commence par un mot-clé d'identification unique et se termine par un double point. deux-points. Une suite est un groupe d'instructions contrôlées par une clause. A suite peut être une ou plusieurs instructions simples séparées par des points-virgules sur la même ligne que l'en-tête, après les deux-points de l'en-tête, ou bien elle peut être une ou plusieurs déclarations indentées sur les lignes suivantes . Seule cette dernière forme de suite peut contenir des instructions composées imbriquées ; la suivante est illégale, principalement parce qu'il ne serait pas clair de savoir à quelle clause if un qui suit une clause else :

if test1: if test2: print x

Notez également que le point-virgule est plus contraignant que le deux-points dans ce contexte. contexte, de sorte que dans l'exemple suivant, toutes les instructions d'impression sont exécutées :

if x < y < z: print x; print y; print z 

Je résume :

compound_stmt ::=  if_stmt
                   | while_stmt
                   | for_stmt
                   | try_stmt
                   | with_stmt
                   | funcdef
                   | classdef
                   | decorated
suite         ::=  stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT
statement     ::=  stmt_list NEWLINE | compound_stmt
stmt_list     ::=  simple_stmt (";" simple_stmt)* [";"]

5 votes

Je ne savais pas que le point-virgule était moins prioritaire que les deux points après un "if". Merci !

3 votes

@gaborous Je trouve personnellement votre commentaire suffisamment ambigu pour que je pense que vous vouliez dire l'inverse. Donc, pour clarifier, je suggère plutôt aux autres lecteurs de s'en tenir à la phrase officielle : dans ce if cond: stmt1; stmt2; stmt3 par exemple, soit toutes les déclarations sont exécutées, soit aucune ne l'est".

0 votes

Oui, c'est ce que je voulais dire, si la priorité est moindre, alors le lexeur ne peut pas quitter le bloc parent (deux points) avant que toutes les instructions point-virgule soient exécutées. Ce n'est vraiment pas une chose évidente.

43voto

kindall Points 60645

Python utilise le ; comme un séparateur, et non comme un terminateur. Vous pouvez également les utiliser à la fin d'une ligne, ce qui les rend regardez comme un terminateur d'instruction, mais cela n'est légal que parce que les instructions vides sont légales en Python -- une ligne qui contient un point-virgule à la fin est constituée de deux instructions, la seconde étant vide.

30 votes

Si vous mettez des doubles points-virgules à la fin (ou n'importe où), vous obtenez une SyntaxError. Il semble donc que les déclarations vides ne soient pas tout à fait légales.

12 votes

Il s'agit probablement de la même logique que pour les listes, les tuples, les dicts avec des virgules de fin sont valides et identiques à leurs homologues coupés (par exemple [1,2,3]==[1,2,3,]) mais ils ne peuvent pas contenir de doubles virgules. Donc, en gros, Python a un "suppresseur de blancs de fin de ligne". Ce qui, d'ailleurs, est clair à partir de ceci : stmt_list ::= simple_stmt (";" simple_stmt)* [";"]

1 votes

@Cucu Vous avez raison. Vous ne pouvez pas non plus commencer une ligne par un point-virgule, ni une liste d'expressions par une virgule. Il est donc plus exact de dire que les points-virgules et les virgules sont des séparateurs. et des terminaisons facultatives.

12voto

Ben Points 22160

Comme tout le monde l'a noté, vous peut utilisez des points-virgules pour séparer les déclarations. Vous ne devez pas ont et ce n'est pas le style habituel.

Pour ce qui est de l'utilité de ce système, certaines personnes aiment mettre deux ou plusieurs déclarations courtes et vraiment triviales sur une seule ligne (personnellement, je pense que cela transforme plusieurs lignes triviales et faciles à parcourir en une seule ligne d'apparence complexe et qu'il est plus difficile de voir que c'est trivial).

Mais c'est presque une obligation lorsque vous invoquez les one liners Python depuis le shell en utilisant python -c '<some python code>' . Ici, vous ne peut pas utilisent l'indentation pour séparer les déclarations. Par conséquent, si votre phrase est en fait une double phrase, vous devrez utiliser un point-virgule. Et si vous voulez utiliser d'autres arguments dans votre one-liner, vous devrez importer sys pour arriver à sys.argv ce qui nécessite un import déclaration. Par exemple

python -c "import sys; print ' '.join(sorted(sys.argv[1:]))" 5 2 3 1 4
1 2 3 4 5

2 votes

Vous peut utiliser l'indentation et les retours à la ligne lors de la transmission des commandes python dans la coquille : Il suffit de répartir le code cité sur plusieurs lignes ou d'utiliser un heredoc. Cependant, cela ne fonctionne pas si vous voulez que ce soit un "one-liner" ;)

0 votes

Comprend des traits pour la réponse ferroviaire avec -c

1 votes

Plus d'informations sur les "one liners". : "...ce qui fait que Python proche de l'inutilité pour les programmes de type "one-liner" en ligne de commande ... Vous pouvez vous en sortir avec une séquence d'instructions simples, séparées par un point-virgule ... dès que vous ajoutez une construction qui introduit un bloc indenté (comme if), vous avez besoin du saut de ligne".

7voto

CommunistPancake Points 360

Une citation de " Quand les pythons attaquent "

Ne terminez pas toutes vos déclarations par un point-virgule. Il est techniquement légal de le faire en Python, mais c'est totalement inutile à moins que vous ne placiez plus d'une déclaration sur une seule ligne (par exemple, x=1 ; y=2 ; z=3).

6 votes

Pourquoi pas ? x,y,z = 1,2,3 ?

7 votes

@AnirbanNag 'tintinmj' Dans ce cas particulier, je pense que x, y, z = 1, 2, 3 est plus lente car elle effectue un aller-retour inutile pour construire un tuple et le désemboîter immédiatement. (En passant, je ne pense pas vraiment que @communistpancake suggère l'utilisation de l'option x=1; y=2; z=3 Mais il y a un motif. Je pense qu'il/elle donne simplement un exemple pour montrer que le point-virgule est un séparateur plutôt qu'un terminateur).

4 votes

@AnirbanNag - parce que cela aurait été un mauvais exemple de ligne à plusieurs états.

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