2011-03-25 10 views
116

Al tratar de obedecer las reglas de estilo de python, he establecido mis editores en un máximo de 79 cols.Estilo Python - ¿continuación de línea con cadenas?

En el PEP, se recomienda utilizar la continuación implícita de python entre corchetes, paréntesis y llaves. Sin embargo, cuando se trata de cadenas cuando alcanzo el límite de col, se pone un poco raro.

Por ejemplo, tratando de utilizar una línea múltiple

mystr = """Why, hello there 
wonderful stackoverflow people!""" 

Will volver

"Why, hello there\nwonderful stackoverflow people!" 

Esto funciona:

mystr = "Why, hello there \ 
wonderful stackoverflow people!" 

ya que devuelve la siguiente:

"Why, hello there wonderful stackoverflow people!" 

Pero, cuando la instrucción se sangra a pocas cuadras en, esto parece raro:

do stuff: 
    and more stuff: 
     and even some more stuff: 
      mystr = "Why, hello there \ 
wonderful stackoverflow people!" 

Si tratas de sangrar la segunda línea:

do stuff: 
    and more stuff: 
     and even some more stuff: 
      mystr = "Why, hello there \ 
      wonderful stackoverflow people!" 

La cadena termina como:

"Why, hello there    wonderful stackoverflow people!" 

La única manera que he encontrado para evitar esto es:

do stuff: 
    and more stuff: 
     and even some more stuff: 
      mystr = "Why, hello there" \ 
      "wonderful stackoverflow people!" 

Lo que más me gusta, pero también es un poco incómodo para los ojos, ya que parece que hay una cuerda sentada en el medio de la nada. Esto producirá el correcto:

"Why, hello there wonderful stackoverflow people!" 

lo tanto, mi pregunta es - ¿Cuáles son las recomendaciones de algunas personas sobre la manera de hacer esto y hay algo que me falta en la guía de estilo que muestro cómo debería estar haciendo esto ?

Gracias.

+1

El alto nivel de sangrado también puede ser una señal de que necesita refactorizar su código por lo que es más modular – Daenyth

+5

I sangría que gran parte para hacer un punto. Pero tenga en cuenta que es bastante fácil alcanzar al menos el tercer nivel de sangría, pero el caso sigue en pie, incluso con un nivel de sangría, el método estándar haría que la cadena fuera de lugar. – sjmh

+0

Posible duplicado de [Ajustar líneas largas en Python] (http://stackoverflow.com/questions/3346230/wrap-long-lines-in-python) – JrBenito

Respuesta

172

Desde adjacent string literals are automatically joint into a single string, sólo puede utilizar la continuación de línea implícita dentro de paréntesis, según lo recomendado por PEP 8:

print("Why, hello there wonderful " 
     "stackoverflow people!") 
+1

Gracias Sven, me gusta un poco más que el estilo que estaba usando. – sjmh

+1

Pensé que esto era solo un truco, pero después de leer el documento de Python, debo decir que esto es claro. Gracias ! – Medorator

2

he conseguido alrededor de este con

mystr = ' '.join(
     ["Why, hello there", 
     "wonderful stackoverflow people!"]) 

en el pasado. No es perfecto, pero funciona muy bien para cadenas muy largas que no necesitan tener saltos de línea.

+12

En mi máquina, esto lleva 350 ns, uniendo una tupla en lugar de una lista toma 250 ns. La unión implícita, por otro lado, solo toma 25 ns. La unión implícita es el claro ganador tanto en simplicidad como en velocidad. – endolith

+6

@endolith: estoy de acuerdo en que usar paréntesis es mejor porque es más limpio, pero este no es un lugar para considerar el rendimiento. Si le importan las diferencias en el tiempo de ejecución del orden de 100 ns, especialmente cuando concatena cadenas codificadas, algo está mal. – nmichaels

+0

No diría que preocuparse por 100ns es incorrecto sin conocer el contexto. ¿Qué pasa si hay un millón de operaciones sucediendo? – Medorator

18

Sólo señalando que se trata de uso de los paréntesis que invoca automáticamente concatenación. Eso está bien si ya los estás usando en la declaración. De lo contrario, simplemente usaría '\' en lugar de insertar paréntesis (que es lo que la mayoría de los IDE hacen automáticamente). La sangría debe alinear la continuación de cadena para que sea compatible con PEP8. Por ejemplo:

my_string = "The quick brown dog " \ 
      "jumped over the lazy fox" 
2

Otra posibilidad es utilizar el módulo de envoltura de texto. Esto también evita el problema de "cadena simplemente sentada en el medio de la nada" como se menciona en la pregunta.

import textwrap 
mystr = """\ 
     Why, hello there 
     wonderful stackoverfow people""" 
print (textwrap.fill(textwrap.dedent(mystr))) 
Cuestiones relacionadas