2010-01-15 21 views
50

He escrito algo de Python en el que algunas líneas superan los 80 caracteres, que es un umbral en el que necesito permanecer. ¿Cómo puedo adaptar mi código para reducir las longitudes de línea?¿Cómo puedo hacer que mi código de Python permanezca por debajo de 80 caracteres por línea?

+38

Mantener el código por debajo de 80 columnas es algo que debería haber muerto hace una década. Apuntar a terminales 80x25 es absurdo y lleva a un código horrible. –

+45

@Glenn Maynard: Estoy totalmente en desacuerdo. La mayoría de las personas aún usan ventanas de editor de 80 caracteres, ya que generalmente hay más de una ventana que desea mantener visible. – Kimvais

+9

Haz lo que quieras, pero ciertamente no estoy desfigurando mi código para ayudar a las personas que insisten en editar el código en ventanas pequeñas. La respuesta de Devin muestra cuán horrible y antinatural es el código cuando haces esto. Un límite razonable es alrededor de 120 columnas. –

Respuesta

19

Si el código que supera los 80 caracteres es una llamada a la función (o definición), rompa la línea del argumento. Python reconocerá el paréntesis y lo verá como una sola línea.

function(arg, arg, arg, arg, 
     arg, arg, arg...) 

Si el código superior a 80 caracteres es una línea de código que no es naturalmente frágil, puede utilizar la barra invertida \ para "escapar" de la nueva línea.

some.weird.namespace.thing.that.is.long = ','.join(strings) + \ 
              'another string' 

También puede usar el paréntesis para su ventaja.

some.weird.namespace.thing.that.is.long = (','.join(strings) + 
              'another string') 

Todos los tipos de soportes fijos {} (dict/set), [] (lista),() (tuplas) se puede dividir en varias líneas sin problemas. Esto permite un formato más agradable.

mydict = { 
    'key': 'value', 
    'yes': 'no' 
} 
+1

¿por qué no? 'thing = some.weird .namespace.thing.that', 'thing.long = ','. join (cadenas) + 'otra cadena'' – guyskk

54

Mi actual editor (Kate) se ha configurado para introducir un salto de línea en los límites de palabra siempre que la longitud de la línea alcanza o supera los 80 caracteres. Esto hace que sea inmediatamente obvio que he sobrepasado los límites. Además, hay una línea roja que marca la posición de 80 caracteres, lo que me da una advertencia anticipada de cuándo va a fluir la línea. Estos me permiten planificar líneas lógicas que se adaptarán a múltiples líneas físicas.

En cuanto a cómo encajarlas realmente, existen varios mecanismos. Puede terminar la línea con un \, pero esto es propenso a errores.

# works 
print 4 + \ 
    2 

# doesn't work 
print 4 + \ 
    2 

¿La diferencia? La diferencia es invisible: hubo un espacio en blanco después de la barra invertida en el segundo caso. Oops!

¿Qué se debe hacer en su lugar? Bueno, rodéelo entre paréntesis.

print (4 + 
    2) 

No \ needed. Esto realmente funciona universalmente, nunca necesitarás \. ¡Incluso para los límites de acceso a los atributos!

print (foo 
    .bar()) 

Para las cadenas, se puede añadir de forma explícita, implícita o usando C-estilo de unión.

# all of these do exactly the same thing 
print ("123" 
    "456") 
print ("123" + 
    "456") 
print "123456" 

Finalmente, cualquier cosa que pueda estar en cualquier forma de soporte ((), []. {}), No sólo paréntesis, en particular, puede tener un salto de línea colocado en cualquier lugar. Entonces, por ejemplo, puedes usar un literal de lista sobre varias líneas, siempre que los elementos estén separados por una coma.

Todo esto y más se pueden encontrar en el official documentation para Python. Además, una nota rápida, PEP-8 especifica 79 caracteres como el límite, no 80-- si tiene 80 caracteres, ya lo ha superado.

+19

** Por favor, use backlashes SOLAMENTE como último recurso ** (ver el enlace en mi respuesta a continuación) – Kimvais

+0

'La diferencia es invisible-- había un carácter de espacio en blanco en el segundo caso'. ... después de la barra diagonal inversa, es solo mencionar. – Boldewyn

+3

@Kimvais: ¿No es exactamente eso lo que Devin sugiere aquí? Incluso muestra un error de ejemplo, que lleva a esta recomendación. – Boldewyn

18

Idiomatic Python dice:

Use backslashes as a last resort

Por lo tanto, si se utilizan paréntesis () es posible, evitar las barras invertidas. Si usted tiene un a.train.wreck.that.spans.across.a.dozen.cars.and-multiple.lines.across.the.whole.trainyard.and.several.states() hacer algo como:

lines = a.train.wreck.that.spans.across.a.dozen.cars.and-multiple.lines 
lines.across.the.whole.trainyard.and.several.states() 

o, preferiblemente, refactorizar su código. Por favor.

+1

Si necesita imprimir, por ejemplo, una gran cantidad de texto estático, una instrucción de uso para una secuencia de comandos CLI, por ejemplo, me gustaría ver cómo lo 'refactoriza'. – Boldewyn

+11

usando 'print (" "" ... text ... "" ")' o 'print (" text "" text "" text ")' – Kimvais

+0

python3.6 f-string 'print (f '{text: -^80} ') 'o' print (' {: -^80} '. Formato (texto)) ' – guyskk

17

me gustaría añadir dos puntos a las respuestas anteriores:

Las cadenas pueden ser concatenadas automáticamente, lo que es muy conveniente:

this_is_a_long_string = ("lkjlkj lkj lkj mlkj mlkj mlkj mlkj mlkj mlkj " 
         "rest of the string: no string addition is necessary!" 
         " You can do it many times!") 

Tenga en cuenta que este es eficiente: esto hace no resultado en la cadena concatenaciones en el intérprete de Python: en cambio, esto simplemente se considera como un único literal de cadena larga, por lo que es eficiente.

Una pequeña advertencia relacionada con la respuesta de Devin: la sintaxis "paréntesis" en realidad no "funciona universalmente". Por ejemplo, d [42] = "H22G" no puede ser escrito como

(d 
[42] = "H2G2") 

porque paréntesis, sólo se pueden utilizar en torno a "calculan" expresión (esto no incluye una asignación (=) como arriba).

Otro ejemplo es el siguiente código, que genera un error de sintaxis:

with (open("..... very long file name .....") 
     as input_file): 

De hecho, los paréntesis no se pueden poner alrededor de declaraciones, más en general (sólo expresiones).

En estos casos, uno puede usar la sintaxis "\" o, mejor (ya que "se debe evitar" si es posible), divida el código en varias instrucciones.

Cuestiones relacionadas