2009-12-09 5 views
112

Como PEP8 sugiere mantener por debajo de la norma de 80 columnas para su programa de pitón, ¿cómo puedo respetar a aquella con cadenas largas, es decirCómo escribir muy larga cadena que se ajusta a PEP8 y prevenir E501

s = "this is my really, really, really, really, really, really, really long string that I'd like to shorten." 

¿Cómo lo haría voy sobre la expansión de este a la siguiente línea, es decir

s = "this is my really, really, really, really, really, really" + 
    "really long string that I'd like to shorten." 
+18

+1 para el movimiento audaz para arriesgarlo todo;) – thethinman

Respuesta

72

concatenación implícito podría ser la solución más limpia:

s = "this is my really, really, really, really, really, really," \ 
    " really long string that I'd like to shorten." 

Editar A reflejo Estoy de acuerdo que la sugerencia de Todd utilizar soportes en lugar de continuación de línea es mejor para todas las razones que da. La única duda que tengo es que es relativamente fácil confundir cadenas entre corchetes con tuplas.

+4

Es por eso que me sentí como un idiota publicando la pregunta. Aclamaciones. – Federer

+3

Esta es la continuación de línea al escapar de la línea final, no meramente concatenación implícita, y hasta hace muy poco tiempo explícitamente prohibido en PEP8, aunque ahora hay una concesión, pero NO para cadenas largas. La respuesta de Todd a continuación es correcta. –

+2

Me gusta PEP8, pero esto es parte de PEP8 que no me gusta. Siento que la continuación implícita es más clara, debido a la posibilidad de confusión con las tuplas – monknomo

5

Backslash:

s = "this is my really, really, really, really, really, really" + \ 
    "really long string that I'd like to shorten." 

o envuelva en parens:

s = ("this is my really, really, really, really, really, really" + 
    "really long string that I'd like to shorten.") 
+2

Tenga en cuenta que la ventaja es necesaria. Python concatena literales de cadena que se suceden. – bukzor

2

Con un \ puede expandir declaraciones a varias líneas:

s = "this is my really, really, really, really, really, really" + \ 
"really long string that I'd like to shorten." 

debería funcionar.

11

Perdió un espacio, y es probable que necesite un carácter de continuación de línea, es decir. a \.

s = "this is my really, really, really, really, really, really" + \ 
    " really long string that I'd like to shorten." 

o incluso:

s = "this is my really, really, really, really, really, really" \ 
    " really long string that I'd like to shorten." 

Parens también funcionaría en lugar de la continuación de línea, pero corre el riesgo de que alguien pensar que la intención de tener una tupla y apenas había olvidado una coma. Tomemos, por ejemplo:

s = ("this is my really, really, really, really, really, really" 
    " really long string that I'd like to shorten.") 

frente:

s = ("this is my really, really, really, really, really, really", 
    " really long string that I'd like to shorten.") 

Con tipado dinámico de Python, el código puede funcionar en ambos sentidos, pero que producen resultados incorrectos con el que no tenía la intención.

12

Creo que la palabra más importante en su pregunta fue "sugiere".

Los estándares de codificación son cosas divertidas. A menudo, la orientación que proporcionan tiene una muy buena base cuando se escribió (por ejemplo, la mayoría de los terminales no pueden mostrar> 80 caracteres en una línea), pero con el tiempo se vuelven funcionalmente obsoletos, pero siguen siendo rígidamente adheridos. Supongo que lo que tienes que hacer aquí es sopesar los méritos relativos de "romper" esa sugerencia en particular contra la legibilidad y mainatibilidad de tu código.

Disculpe, esto no responde directamente su pregunta.

+0

Estoy totalmente de acuerdo. Hay una regla de estilo Java similar que también se ha vuelto obsoleta (en mi humilde opinión). –

+0

Sí, estoy de acuerdo, sin embargo, me ha estado dando vueltas cómo podría cumplirlo en este ejemplo en particular. Siempre trato de mantener las clases, los métodos en <80 caracteres, sin embargo, diría que una cadena como esta no tiene otro efecto que no sea uno negativo. – Federer

+0

+1 para argumentos válidos :) – Federer

176

Además, debido vecinos constantes de cadena se concatenan automáticamente, puede codificarlo como esto también:

s = ("this is my really, really, really, really, really, really, " 
    "really long string that I'd like to shorten.") 

Nota ningún signo más, y yo añadió el coma adicional y el espacio que sigue el formato del ejemplo.

Personalmente no me gustan las barras diagonales inversas, y recuerdo haber leído en alguna parte que su uso está en desuso en favor de este formulario, que es más explícito. Recuerde: "Explícito es mejor que implícito".

Considero que la barra diagonal inversa es menos clara y menos útil porque en realidad se está escapando del carácter de nueva línea. No es posible poner un comentario de final de línea después si es necesario. Es posible hacer esto con las constantes de cadena concatenada:

s = ("this is my really, really, really, really, really, really, " # comments ok 
    "really long string that I'd like to shorten.") 

que utiliza una búsqueda en Google de "longitud de la línea pitón" que devuelve el enlace PEP8 como primer resultado, sino que también vincula a otro buen post StackOverflow sobre este tema: "Why should Python PEP-8 specify a maximum line length of 79 characters?"

Otra buena frase de búsqueda sería "continuación de línea de python".

+0

+1 de acuerdo con todo – u0b34a0f6ae

+0

+1: "Personalmente no me gustan las barras diagonales inversas, y recuerdo haber leído en alguna parte que su uso está obsoleto a favor de esta forma, que es más explícita. Recuerde "Explicit is better than implicit." " –

+7

Para todos los que obtienen una tupla y se preguntan por qué. No agregue comas al final de las líneas aquí, que dará como resultado una tupla, no una cadena. ;) – bugmenot123

Cuestiones relacionadas