Pregunta ¿Cómo puedo hacer un salto de línea (continuación de línea)?


Tengo una larga línea de código que quiero dividir entre múltiples líneas. ¿Qué uso y cuál es la sintaxis?

Por ejemplo, agregar un montón de cadenas,

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

y tenerlo en dos líneas como esta:

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

801
2017-09-09 23:45


origen


Respuestas:


¿Cuál es la línea? Solo puede tener argumentos en la línea siguiente sin ningún problema:

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

De lo contrario, puedes hacer algo como esto:

if a == True and \
   b == False

Comprobar el guía de estilo para más información.

De tu línea de ejemplo:

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

O:

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

Tenga en cuenta que la guía de estilo dice que es preferible usar la continuación implícita con paréntesis, pero en este caso particular, simplemente agregar paréntesis alrededor de su expresión probablemente sea el camino equivocado.


910
2017-09-09 23:52



De Guía de estilo para el código Python:

La forma preferida de envolver líneas largas es mediante el uso de la continuación de línea implícita de Python entre paréntesis, corchetes y llaves. Las líneas largas se pueden dividir en varias líneas envolviendo expresiones entre paréntesis. Deben usarse con preferencia al uso de una barra diagonal inversa para la continuación de línea.

Las barras invertidas aún pueden ser apropiadas a veces. Por ejemplo, long, multiple with-statements no puede usar la continuación implícita, por lo que las barras diagonales inversas son aceptables:

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())

Otro caso similar es con afirmaciones afirmativas.

Asegúrese de aplicar sangría a la línea continua apropiadamente. El lugar preferido para romper con un operador binario es después el operador, no antes. Algunos ejemplos:

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)

EDITAR: PEP8 ahora recomienda la convención opuesta (para romper en las operaciones binarias) utilizado por los matemáticos y sus editores para mejorar la legibilidad.

El estilo de Donald Knuth de romper antes de un operador binario alinea a los operadores verticalmente, reduciendo así la carga de trabajo del ojo al determinar qué elementos se agregan y se restan.

De PEP8: ¿Debería romperse una línea antes o después de un operador binario?:

Donald Knuth explica la regla tradicional en su serie de Ordenadores y Composición tipográfica: "Aunque las fórmulas dentro de un párrafo siempre se rompen después de las operaciones y relaciones binarias, las fórmulas mostradas siempre se rompen antes de las operaciones binarias" [3].

Seguir la tradición de las matemáticas generalmente da como resultado un código más legible:

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

En el código de Python, es posible romper antes o después de un operador binario, siempre que la convención sea coherente a nivel local. Para el nuevo código, se sugiere el estilo de Knuth.

[3]: The TeXBook de Donald Knuth, páginas 195 y 196


177
2017-09-10 00:06



El peligro de utilizar una barra diagonal inversa para finalizar una línea es que si se agrega espacio en blanco después de la barra diagonal inversa (que, por supuesto, es muy difícil de ver), la barra diagonal inversa ya no está haciendo lo que usted pensó que era.

Ver Python Idioms y Anti-Idioms (para Python 2 o Python 3) para más.


59
2017-09-15 06:28



Puede dividir líneas entre paréntesis y llaves. Además, puede agregar el carácter de barra diagonal inversa \ a una línea para romperla explícitamente:

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

20
2017-09-21 12:20



Poner un \ al final de tu línea o encierra la declaración en parens ( .. ). De IBM:

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

o

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

19
2017-09-09 23:48



De la boca del caballo: Línea explícita   unión

Dos o más líneas físicas pueden ser   unido en líneas lógicas usando   caracteres de barra invertida (\), como sigue:   cuando una línea física termina en un   barra diagonal inversa que no es parte de una cadena   literal o comentario, se une con   los siguientes formando una sola lógica   línea, eliminando la barra diagonal inversa y   siguiente carácter de final de línea. por   ejemplo:

if 1900 < year < 2100 and 1 <= month <= 12 \
   and 1 <= day <= 31 and 0 <= hour < 24 \
   and 0 <= minute < 60 and 0 <= second < 60:   # Looks like a valid date
        return 1

Una línea que termina en una barra invertida no puede   lleva un comentario. Una barra invertida no   continúa un comentario Una barra invertida   no continuar un token excepto por una cadena   literales (es decir, tokens que no sean   los literales de cadena no se pueden dividir   líneas físicas usando una barra invertida). UN   la barra invertida es ilegal en otro lugar en un   línea fuera de un literal de cadena.


17
2017-09-09 23:53