textwrap.dedent()
está cerca de lo que quiere , pero no implementa lo que pediste, porque tiene una nueva línea principal. Usted puede envolver dedent
en una función que elimina el salto de línea que va desde s
:
def my_dedent(string):
if string and string[0] == '\n':
string = string[1:]
return textwrap.dedent(string)
Sin embargo textwrap.dedent()
maneja líneas con solo espacio en blanco de manera especial que está bien si está generando fuente de Python de una declaración de varias líneas guión, donde se arrastra el espacio en blanco es insignificante.
Pero, en general, no es apropiado que textwrap.dedent()
elimina los espacios en blanco extra de líneas con más espacios en blanco que el 'guión máximo', elimina los espacios en blanco de todas las líneas de espacio en blanco y que descards cualquier espacio en blanco antes del cierre """
, sobre todo porque este comportamiento es undocumented and done with non-transparent regular expressions .
Como también genero código fuente que no es de Python donde los espacios son a menudo significativos, utilizo la siguiente rutina. No maneja la sangría TAB, pero le proporciona la salida que solicitó sin encabezar la nueva línea, donde textwrap.dedent()
falla.
def remove_leading_spaces(s, strict=False):
'''Remove the maximum common spaces from all non-empty lines in string
Typically used to remove leading spaces from all non-empty lines in a
multiline string, preserving all extra spaces.
A leading newline (when not useing '"""\') is removed unless the strict
argument is True.
Note that if you want two spaces on the last line of the return value
without a newline, you have to use the max indentation + 2 spaces before
the closing """. If you just input 2 spaces that is likely to be the
maximum indent.
'''
if s and not strict and s[0] == '\n':
s = s[1:]
lines = s.splitlines(True) # keep ends
max_spaces = -1
for line in lines:
if line != '\n':
for idx, c in enumerate(line[:max_spaces]):
if not c == ' ':
break
max_spaces = idx + 1
return ''.join([l if l == '\n' else l[max_spaces-1:] for l in lines])
No sabía que existía uno. Cosas útiles. +1. –
Esa es la acumulación más rápida de votos positivos que he visto para una respuesta – Hubro
Código fuente de dedent aquí: http://hg.python.org/cpython/file/2.7/Lib/textwrap.py – Jiri