1266 votes

Comment faire un saut de ligne (continuation de ligne) en Python ?

J'ai une longue ligne de code que je veux diviser en plusieurs lignes. Que dois-je utiliser et quelle est la syntaxe ?

Par exemple, en ajoutant un bouquet de chaînes de caractères,

e = 'a' + 'b' + 'c' + 'd'

et l'avoir en deux lignes comme ceci :

e = 'a' + 'b' +
    'c' + 'd'

1425voto

Harley Holcombe Points 34618

Quelle est la ligne ? Vous pouvez avoir des arguments sur la ligne suivante sans aucun problème :

a = dostuff(blahblah1, blahblah2, blahblah3, blahblah4, blahblah5, 
            blahblah6, blahblah7)

Sinon, vous pouvez faire quelque chose comme ça :

if (a == True and
    b == False):

ou avec un saut de ligne explicite :

if a == True and \
   b == False:

Vérifiez le guide de style pour plus d'informations.

En utilisant les parenthèses, votre exemple peut être écrit sur plusieurs lignes :

a = ('1' + '2' + '3' +
    '4' + '5')

Le même effet peut être obtenu en utilisant un saut de ligne explicite :

a = '1' + '2' + '3' + \
    '4' + '5'

Notez que le guide de style indique qu'il est préférable d'utiliser la suite implicite avec des parenthèses, mais dans ce cas particulier, le simple fait d'ajouter des parenthèses autour de votre expression est probablement la mauvaise solution.

42 votes

En fait, vous avez la préférence du guide de style exactement à l'envers. La continuation implicite est préférée, le backslash explicite ne doit être utilisé que si nécessaire.

0 votes

Je pense que cela veut dire que si vous avez déjà des parenthèses autour d'une expression, utilisez-les, mais ne mettez pas de parenthèses autour d'une expression dans le seul but de la répartir sur plusieurs lignes. Ce n'est pas une règle absolue. Je pense que pour la ligne de la question, une barre oblique inversée est la meilleure solution.

0 votes

Ce n'est pas correct. Veuillez modifier votre réponse pour refléter ce que le guide de style dit réellement, plutôt que d'affirmer le contraire.

272voto

J.F. Sebastian Points 102961

De PEP 8 -- Guide de style pour le code Python :

La meilleure façon d'envelopper les longues lignes est d'utiliser la continuation de ligne implicite de Python à l'intérieur des parenthèses, des crochets et des accolades. Les longues lignes peuvent être réparties sur plusieurs lignes en mettant les expressions entre parenthèses. Celles-ci doivent être utilisées de préférence à l'utilisation d'une barre oblique inverse pour la continuation de la ligne.

Les retours en arrière peuvent encore être appropriés à certains moments. Par exemple, les déclarations avec longues et multiples ne peuvent pas utiliser la continuation implicite, les barres obliques inversées sont donc acceptables :

with open('/path/to/some/file/you/want/to/read') as file_1, \
     open('/path/to/some/file/being/written', 'w') as file_2:
     file_2.write(file_1.read())

Un autre cas de figure est celui des déclarations d'assertion.

Veillez à mettre en retrait la ligne continue de manière appropriée. L'endroit préféré pour faire une pause autour d'un opérateur binaire est après l'opérateur, pas avant. Quelques exemples :

class Rectangle(Blob):
    def __init__(self, width, height,
                 color='black', emphasis=None, highlight=0):
        if (width == 0 and height == 0 and
            color == 'red' and emphasis == 'strong' or
            highlight > 100):
            raise ValueError("sorry, you lose")
        if width == 0 and height == 0 and (color == 'red' or
                                           emphasis is None):
            raise ValueError("I don't think so -- values are %s, %s" %
                             (width, height))
        Blob.__init__(self, width, height,
                      color, emphasis, highlight)file_2.write(file_1.read())

Le PEP8 recommande maintenant le convention contraire (pour briser les opérations binaires) utilisé par les mathématiciens et leurs éditeurs pour améliorer la lisibilité.

Le style de rupture de Donald Knuth avant un opérateur binaire aligne les opérateurs verticalement, ce qui réduit la charge de travail de l'œil lorsqu'il s'agit de déterminer les éléments à additionner et à soustraire.

De PEP8 : Une ligne doit-elle être coupée avant ou après un opérateur binaire ? :

Donald Knuth explique la règle traditionnelle dans sa série Computers and Typesetting : "Bien que les formules à l'intérieur d'un paragraphe s'interrompent toujours après les opérations binaires et les relations, les formules affichées s'interrompent toujours avant les opérations binaires" [3].

En suivant la tradition des mathématiques, on obtient généralement un code plus lisible :

# Yes: easy to match operators with operands
income = (gross_wages
          + taxable_interest
          + (dividends - qualified_dividends)
          - ira_deduction
          - student_loan_interest)

Dans le code Python, il est permis de casser avant ou après un opérateur binaire, tant que la convention est cohérente localement. Pour un nouveau code, le style de Knuth est suggéré.

[3] : Donald Knuth's The TeXBook, pages 195 et 196

4 votes

NB : la recommandation a changé en 2010 : "Les longues lignes peuvent être rompues ... en mettant les expressions entre parenthèses. Celles-ci devraient être utilisées de préférence à l'utilisation d'une barre oblique inversée...", et toutes les barres obliques inversées ont été supprimées de l'exemple de code.

1 votes

@e100 : lisez le texte en gras ci-dessus : The preferred way .. is by using Python's implied line continuation inside parentheses c'est la même chose que by wrapping expressions in parentheses . J'ai mis à jour l'exemple

10 votes

Mais notez que "parfois l'utilisation d'une barre oblique inversée est mieux" a également disparu.

81voto

George V. Reilly Points 5471

Le danger d'utiliser une barre oblique inversée pour terminer une ligne est que si un espace blanc est ajouté après la barre oblique inversée (ce qui, bien sûr, est très difficile à voir), la barre oblique inversée ne fait plus ce que vous pensiez qu'elle faisait.

Voir les idiomes et anti-idiomes de Python (pour Python 2 o Python 3 ) pour en savoir plus.

10 votes

C'est l'une des raisons pour lesquelles il est agréable de pouvoir mieux voir les espaces blancs de fin de ligne, c'est-à-dire quelque chose comme set list listchars=trail:· en vim. :)

0 votes

Ce n'est pas seulement vrai pour l'espace après la barre oblique inversée. La barre oblique inversée doit être strictement le dernier caractère de la ligne. En particulier, vous ne pouvez pas commenter des termes spécifiques dans une somme en coupant la ligne avec une barre oblique inverse et en mettant un commentaire après. Les parenthèses fonctionnent bien :)

33voto

SCdF Points 11397

Mettez un \ à la fin de la ligne ou entre parenthèses. ( .. ) . De IBM :

b = ((i1 < 20) and
     (i2 < 30) and
     (i3 < 40))

ou

b = (i1 < 20) and \
    (i2 < 30) and \
    (i3 < 40)

28voto

Konrad Rudolph Points 231505

Vous pouvez interrompre les lignes entre les parenthèses et les accolades. De plus, vous pouvez ajouter le caractère backslash (barre oblique inversée) \ à une ligne pour la rompre explicitement :

x = (tuples_first_value,
     second_value)
y = 1 + \
    2

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