¿Cómo divido la definición de una cadena larga en varias líneas?
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
¿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 s
como 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.
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.
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"
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
Me encontré feliz con este:
string = """This is a
very long string,
containing commas,
that I split up
for readability""".replace('\n',' ')