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 no estoy realmente preocupado por 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 / forma más pitónica de hacerlo. Se ve incómodo. Código actual:
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
python
string
multiline
multilinestring
Pablo Mescher
fuente
fuente
Respuestas:
¿Estás hablando de cadenas de varias líneas? Fácil, use comillas triples para comenzar y finalizarlas.
También puede 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 inicial (como lo señala @ root45). Esta cadena también contendrá espacios en blanco y líneas nuevas.
Es decir,:
Finalmente, uno también puede construir líneas largas en Python como esta:
que no incluirá espacios en blanco adicionales o nuevas líneas (este es un ejemplo deliberado que muestra el resultado de omitir espacios en blanco):
No se requieren comas, simplemente coloque las cadenas que se unirán en un par de paréntesis y asegúrese de tener en cuenta los espacios en blanco y las nuevas líneas necesarias.
fuente
+
operador no hace que la concatenación suceda en tiempo de ejecución?textwrap.dedent
para eliminar espacios en blanco iniciales no deseados. docs.python.org/3/library/textwrap.html#textwrap.dedentSi no desea una cadena multilínea pero solo tiene una cadena larga de una sola línea, puede usar paréntesis, solo asegúrese de no incluir comas entre los segmentos de la cadena, entonces será una tupla.
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 sería un problema, entonces esta sería una buena manera de lograr lo que desea.
fuente
,
'
?.format(...)
después del paréntesis de cierre.%
la notación de formateo también debe funcionar, pero no lo he intentado' foo '+variable
lo que no funcionará, pero lo' foo '+variable+''
hará.Romper líneas por
\
obras para mí. Aquí hay un ejemplo:fuente
longStr = "account: " + account_id + \ ...
the backslash is redundant between brackets
cuando escribí en el interiorprint()
Me encontré feliz con este:
fuente
.replace('\t','')
Encuentro que al construir cadenas largas, generalmente está haciendo algo como construir una consulta SQL, en cuyo caso esto es lo mejor:
Lo que Levon sugirió es bueno, pero podría ser vulnerable a los errores:
fuente
También puede concatenar variables cuando usa la notación "" ":
EDITAR: Se encontró una mejor manera, con params con nombre y .format ():
fuente
Este enfoque utiliza:
solo una barra invertida para evitar un salto de línea inicialtextwrapinspect
account_id
ydef_id
.De esta manera me parece lo más pitónico.
Actualización : 29/01/2019 Incorpore la sugerencia de @ ShadowRanger de usar en
inspect.cleandoc
lugar detextwrap.dedent
fuente
inspect.cleandoc
es un poco más bonitas quetextwrap.dedent
, ya que no requiere la primera línea a estar vacío con un carácter de continuación de línea al final.inspect.cleandoc
para esto.En Python> = 3.6 puede usar literales de cadena formateados (cadena f)
fuente
Por ejemplo:
Si el valor de la condición debe ser una cadena, puede hacer esto:
fuente
Encuentro
textwrap.dedent
lo mejor para cadenas largas como se describe aquí :fuente
Otros ya han mencionado el método de paréntesis, pero me gustaría agregar que con paréntesis, se permiten comentarios en línea.
Comente sobre cada fragmento:
Comentario no permitido después de la continuación:
Cuando se usan continuaciones de línea de barra diagonal inversa (
\
), no se permiten comentarios. Recibirás unSyntaxError: unexpected character after line continuation character
error.Mejores comentarios para las cadenas Regex:
Según el ejemplo de https://docs.python.org/3/library/re.html#re.VERBOSE ,
fuente
Personalmente, considero que la siguiente es la mejor manera (simple, segura y Pythonic) de escribir consultas SQL sin procesar en Python, especialmente cuando se usa el módulo sqlite3 de Python :
Pros
Contras
?
marcador de posición, puede ser un poco difícil hacer un seguimiento de cuál?
será sustituido por qué variable de Python cuando hay muchas de ellas en la consulta.fuente
cursor.execute(query.format(vars))
. Eso debería encargarse de su única "estafa" (espero).format
sería bueno, pero no estoy seguro de si la cadena de consulta formateada de esa manera estaría a salvo de la inyección de SQL.cursor.execute(query.format(vars))
ya no se beneficia de las declaraciones preparadas, por lo que es vulnerable a muchos tipos de problemas, comenzando con el hecho de que si los parámetros no son solo números, debe citarlos dos veces en la consulta SQL.Usualmente uso algo como esto:
Si desea eliminar espacios en blanco molestos en cada línea, puede hacer lo siguiente:
fuente
textwrap.dedent
función de Python , que está en la biblioteca estándar, tiene la funcionalidad que necesita.inspect.cleandoc
es un poco más agradable (menos quisquilloso sobre si el texto aparece o no en la misma línea que las comillas abiertas, no requiere caracteres de continuación de línea explícitos).Su código real no debería funcionar, le faltan espacios en blanco al final de las "líneas" (por ejemplo:
role.descr as roleFROM...
)Hay comillas triples para cadenas multilínea:
Contendrá los saltos de línea y espacios adicionales, pero para SQL eso no es un problema.
fuente
También puede colocar la instrucción sql en un archivo separado
action.sql
y cargarlo en el archivo py conEntonces las sentencias sql se separarán del código de Python. Si hay parámetros en la instrucción sql que deben completarse desde python, puede usar el formateo de cadenas (como% so {campo})
fuente
Forma "À la" Scala (pero creo que es la forma más pitónica que exige OQ):
Si desea str final sin líneas de salto, simplemente coloque
\n
al comienzo del primer argumento del segundo reemplazo:Nota: la línea blanca entre "... plantillas". y "Además, ..." requiere un espacio en blanco después de
|
.fuente
tl; dr: Use
"""\
y"""
para envolver la cadena , como enDe la documentación oficial de Python :
fuente
Oye, prueba algo como esto, espero que funcione, como en este formato te devolverá una línea continua como si hubieras preguntado con éxito sobre esta propiedad '
fuente
Utilizo una función recursiva para construir consultas SQL complejas. Esta técnica generalmente se puede usar para construir cadenas grandes mientras se mantiene la legibilidad del código.
PD: Eche un vistazo a la impresionante biblioteca python-sqlparse para imprimir bonitas consultas SQL si es necesario. http://sqlparse.readthedocs.org/en/latest/api/#sqlparse.format
fuente
Otra opción que creo que es más legible cuando el código (por ejemplo, la variable) está sangrado y la cadena de salida debe ser un trazador de líneas (sin líneas nuevas):
fuente
Use comillas triples. La gente a menudo los usa para crear cadenas de documentos al comienzo de los programas para explicar su propósito y otra información relevante para su creación. Las personas también usan estos en funciones para explicar el propósito y la aplicación de funciones. Ejemplo:
fuente
Me gusta este enfoque porque privilegia la lectura. ¡En casos donde tenemos cuerdas largas no hay forma! Dependiendo del nivel de sangría en el que se encuentre y aún limitado a 80 caracteres por línea ... Bueno ... No es necesario decir nada más. Desde mi punto de vista, las guías de estilo Python siguen siendo muy vagas. Tomé el enfoque @Eero Aaltonen porque privilegia la lectura y el sentido común. Entiendo que las guías de estilo deberían ayudarnos y no hacer que nuestras vidas sean un desastre. ¡Gracias!
fuente
De la documentación oficial de Python :
fuente
Para definir una cadena larga dentro de un dict, manteniendo las nuevas líneas pero omitiendo los espacios , terminé definiendo la cadena en una constante como esta:
fuente
Como enfoque general para cadenas largas en Python, puede usar comillas triples
split
yjoin
:Salida:
Con respecto a la pregunta de OP relacionada con una consulta SQL, la respuesta a continuación ignora la exactitud de este enfoque para crear consultas SQL y se centra solo en construir cadenas largas de una manera legible y estética sin importaciones adicionales. También ignora la carga computacional que esto conlleva.
Usando comillas triples, construimos una cadena larga y legible que luego dividimos en una lista usando, de
split()
ese modo, eliminamos el espacio en blanco y luego lo unimos nuevamente' '.join()
. Finalmente insertamos las variables usando elformat()
comando:Produce:
Editar: este enfoque no está en línea con PEP8, pero a veces me resulta útil
fuente
En general, uso
list
yjoin
para comentarios / cadenas de varias líneas.puede usar cualquier cadena para unir todo este elemento de la lista como '
\n
' (nueva línea) o ',
' (coma) o '' (espacio)
Salud..!!
fuente