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:
from matplotlib.cbook import dedent
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:
"""
line 1 of string
line 2 of string
"""
"""\
line 1 of string
line 2 of string
"""
"""line 1 of string
line 2 of string
"""
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.
def example():
long_string = '''\
Lorem ipsum dolor sit amet, consectetur adipisicing
elit, sed do eiusmod tempor incididunt ut labore et
dolore magna aliqua. Ut enim ad minim veniam, quis
nostrud exercitation ullamco laboris nisi ut aliquip.\
'''
return long_string
print example()