¿Cómo divido la definición de una cadena larga en varias líneas?

Resuelto Pablo Mescher asked hace 12 años • 30 respuestas

Tengo una consulta muy larga. Me gustaría dividirlo en varias líneas en Python. Una forma de hacerlo en JavaScript sería usar varias oraciones y unirlas con un +operador (lo sé, tal vez no sea la forma más eficiente de hacerlo, pero realmente no me preocupa el rendimiento en esta etapa, solo la legibilidad del código) . Ejemplo:

var long_string = 'some text not important. just garbage to' +
                      'illustrate my example';

Intenté hacer algo similar en Python, pero no funcionó, así que solía \dividir la cadena larga. Sin embargo, no estoy seguro de si esta es la única/mejor/más pitónica forma de hacerlo. Parece incómodo. Código real:

query = 'SELECT action.descr as "action", '\
    'role.id as role_id,'\
    'role.descr as role'\
    'FROM '\
    'public.role_action_def,'\
    'public.role,'\
    'public.record_def, '\
    'public.action'\
    'WHERE role.id = role_action_def.role_id AND'\
    'record_def.id = role_action_def.def_id AND'\
    'action.id = role_action_def.action_id AND'\
    'role_action_def.account_id = ' + account_id + ' AND'\
    'record_def.account_id=' + account_id + ' AND'\
    'def_id=' + def_id
Pablo Mescher avatar May 19 '12 05:05 Pablo Mescher
Aceptado

¿Estás hablando de cadenas de varias líneas? Fácil, utiliza comillas triples para iniciarlas y finalizarlas.

s = """ this is a very
        long string if I had the
        energy to type more and more ..."""

También puedes usar comillas simples (3 de ellas, por supuesto, al principio y al final) y tratar la cadena resultante scomo cualquier otra cadena.

NOTA : Al igual que con cualquier cadena, cualquier cosa entre las comillas iniciales y finales se convierte en parte de la cadena, por lo que este ejemplo tiene un espacio en blanco al principio (como lo señala @root45). Esta cadena también contendrá espacios en blanco y nuevas líneas.

Es decir,:

' this is a very\n        long string if I had the\n        energy to type more and more ...'

Finalmente, también se pueden construir líneas largas en Python como esta:

 s = ("this is a very"
      "long string too"
      "for sure ..."
     )

que no incluirá espacios en blanco o nuevas líneas adicionales (este es un ejemplo deliberado que muestra el efecto de omitir espacios en blanco):

'this is a verylong string toofor sure ...'

No se requieren comas, simplemente coloque las cadenas que se unirán entre paréntesis y asegúrese de tener en cuenta los espacios en blanco y las nuevas líneas necesarias.

Levon avatar May 18 '2012 22:05 Levon

Si no desea una cadena de varias líneas, sino solo una cadena larga de una sola línea, puede usar paréntesis. Solo asegúrate de no incluir comas entre los segmentos de cadena (entonces será una tupla).

query = ('SELECT   action.descr as "action", '
         'role.id as role_id,'
         'role.descr as role'
         ' FROM '
         'public.role_action_def,'
         'public.role,'
         'public.record_def, '
         'public.action'
         ' WHERE role.id = role_action_def.role_id AND'
         ' record_def.id = role_action_def.def_id AND'
         ' action.id = role_action_def.action_id AND'
         ' role_action_def.account_id = '+account_id+' AND'
         ' record_def.account_id='+account_id+' AND'
         ' def_id='+def_id)

En una declaración SQL como la que está construyendo, las cadenas multilínea también estarían bien. Pero si el espacio en blanco adicional que contendría una cadena multilínea fuera un problema, entonces esta sería una buena manera de lograr lo que desea.

Como se indicó en los comentarios, concatenar consultas SQL de esta manera es un riesgo de seguridad de inyección SQL que está a punto de ocurrir , así que use la función de consultas parametrizadas de su base de datos para evitar esto. Sin embargo, dejo la respuesta como está, ya que responde directamente a la pregunta formulada.

Jesse avatar May 18 '2012 22:05 Jesse

Romper líneas \funciona para mí. Aquí hay un ejemplo:

longStr = "This is a very long string " \
        "that I wrote to help somebody " \
        "who had a question about " \
        "writing long strings in Python"
amphibient avatar Jun 20 '2014 16:06 amphibient

Encuentro que cuando se crean cadenas largas, normalmente se hace algo como crear una consulta SQL, en cuyo caso es mejor:

query = ' '.join((  # Note double parentheses. join() takes an iterable
    "SELECT foo",
    "FROM bar",
    "WHERE baz",
))

Lo que Levon sugirió es bueno, pero podría ser vulnerable a errores:

query = (
    "SELECT foo"
    "FROM bar"
    "WHERE baz"
)

query == "SELECT fooFROM barWHERE baz"  # Probably not what you want
darkfeline avatar Jun 19 '2014 07:06 darkfeline

Me encontré feliz con este:

string = """This is a
very long string,
containing commas,
that I split up
for readability""".replace('\n',' ')
Eero Aaltonen avatar Jan 04 '2013 10:01 Eero Aaltonen