¿Cuál es la sangría adecuada para las cadenas multilínea de Python dentro de una función?
def method():
string = """line one
line two
line three"""
o
def method():
string = """line one
line two
line three"""
¿o algo mas?
Parece un poco extraño tener la cadena colgando fuera de la función en el primer ejemplo.
method.__doc__
Python no lo modifica más que cualquier otrostr
literal.Respuestas:
Probablemente quieras alinearte con el
"""
Dado que las líneas nuevas y los espacios se incluyen en la cadena en sí, tendrá que procesarla posteriormente. Si no desea hacer eso y tiene una gran cantidad de texto, es posible que desee almacenarlo por separado en un archivo de texto. Si un archivo de texto no funciona bien para su aplicación y no desea realizar un postproceso, probablemente iría con
Si desea postprocesar una cadena multilínea para recortar las partes que no necesita, debe considerar el
textwrap
módulo o la técnica para las cadenas de documentos de posprocesamiento presentadas en PEP 257 :fuente
trim()
función especificada en PEP257 se implementa en la biblioteca estándar comoinspect.cleandoc
.string
detext
o cualquier cosa de una longitud diferente, entonces ahora tiene que actualizar la sangría de , literalmente, cada línea de la cadena multilínea solo para que coincida con la"""
correcta. La estrategia de sangría no debería complicar los futuros refactores / mantenimiento, y es uno de los lugares donde la PEP realmente fallaLa
textwrap.dedent
función permite comenzar con una sangría correcta en la fuente y luego quitarla del texto antes de usarla.La compensación, como han señalado algunos otros, es que esta es una llamada de función adicional en el literal; tenga esto en cuenta al decidir dónde colocar estos literales en su código.
Lo que
\
sigue en el mensaje de registro literal es asegurar que el salto de línea no esté en el literal; de esa manera, el literal no comienza con una línea en blanco, sino que comienza con la siguiente línea completa.El valor de retorno de
textwrap.dedent
es la cadena de entrada con todas las sangrías de espacios en blanco iniciales comunes eliminadas en cada línea de la cadena. Entonces ellog_message
valor anterior será:fuente
textwrap.dedent()
llamada es un valor constante, al igual que su argumento de entrada.def foo: return foo.x
luego la siguiente líneafoo.x = textwrap.dedent("bar")
.Use
inspect.cleandoc
así:La sangría relativa se mantendrá como se esperaba. Como se comenta a continuación, si desea mantener las líneas vacías anteriores, use
textwrap.dedent
. Sin embargo, eso también mantiene el salto de primera línea.fuente
inspect.cleandoc
existe desde Python 2.6 , que fue 2008 ...? Absolutamente la respuesta más limpia, especialmente porque no usa el estilo de sangría colgante, que solo desperdicia una cantidad innecesaria de espacioUna opción que parece faltar en las otras respuestas (solo mencionada en un comentario de naxa) es la siguiente:
Esto permitirá una alineación adecuada, unirá las líneas implícitamente y aún mantendrá el desplazamiento de línea, lo cual, para mí, es una de las razones por las que me gustaría usar cadenas multilínea de todos modos.
No requiere ningún procesamiento posterior, pero debe agregar manualmente
\n
en cualquier lugar donde desea que finalice la línea. Ya sea en línea o como una cadena separada después. Este último es más fácil de copiar y pegar.fuente
Algunas opciones mas. En Ipython con pylab habilitado, dedent ya está en el espacio de nombres. Lo comprobé y es de matplotlib. O se puede importar con:
En la documentación dice que es más rápido que el equivalente de textwrap y en mis pruebas en ipython es de hecho 3 veces más rápido en promedio con mis pruebas rápidas. También tiene la ventaja de que descarta las líneas en blanco iniciales, esto le permite ser flexible en la forma de construir la cadena:
Usar el dedent matplotlib en estos tres ejemplos dará el mismo resultado sensible. La función de sangría textwrap tendrá una línea en blanco con el primer ejemplo.
La desventaja obvia es que textwrap está en la biblioteca estándar mientras que matplotlib es un módulo externo.
Algunas compensaciones aquí ... las funciones dedent hacen que su código sea más legible donde se definen las cadenas, pero requieren un procesamiento posterior para obtener la cadena en formato utilizable. En las cadenas de documentos es obvio que debe usar la sangría correcta ya que la mayoría de los usos de la cadena de documentos harán el procesamiento requerido.
Cuando necesito una cadena no larga en mi código, encuentro el siguiente código ciertamente feo donde dejo que la cadena larga salga de la sangría adjunta. Definitivamente falla en "Hermoso es mejor que feo", pero se podría argumentar que es más simple y más explícito que la alternativa dedent.
fuente
Si desea una solución rápida y fácil y se ahorra escribir nuevas líneas, puede optar por una lista, por ejemplo:
fuente
yo prefiero
o
fuente
Mis dos centavos, escapar del final de la línea para obtener las sangrías:
fuente
Vine aquí buscando un simple 1-liner para eliminar / corregir el nivel de ideación de la cadena de documentos para imprimir, sin hacer que se vea desordenado , por ejemplo, haciéndolo "colgar fuera de la función" dentro del script.
Esto es lo que terminé haciendo:
Obviamente, si está sangrando con espacios (por ejemplo, 4) en lugar de la tecla de tabulación, use algo como esto en su lugar:
Y no es necesario que elimine el primer carácter si desea que sus cadenas de documentos se vean así:
fuente
La primera opción es la buena, con sangría incluida. Está en estilo python: proporciona legibilidad para el código.
Para mostrarlo correctamente:
fuente
Depende de cómo desea que se muestre el texto. Si desea que todo esté alineado a la izquierda, formatee como en el primer fragmento o itere a través de las líneas que recortan a la izquierda todo el espacio.
fuente
Para cadenas, puede justo después de procesar la cadena. Para las cadenas de documentos, debe procesar después la función en su lugar. Aquí hay una solución para ambos que todavía es legible.
fuente
inspect.cleandoc
, que hacen esto de la manera correcta.Tengo un problema similar, el código se volvió realmente ilegible usando multilíneas, salí con algo como
sí, al principio podría parecer terrible, pero la sintaxis incorporada era bastante compleja y agregar algo al final (como '\ n "') no era una solución
fuente
Puede usar esta función trim_indent .
Resultado:
fuente