Eu tenho uma consulta muito longa. Eu gostaria de dividi-lo em várias linhas em Python. Uma maneira de fazer isso em JavaScript seria usar várias frases e juntá-las a um +
operador (eu sei, talvez não seja a maneira mais eficiente de fazer isso, mas não estou realmente preocupado com o desempenho nesta fase, apenas com a legibilidade do código) . Exemplo:
var long_string = 'some text not important. just garbage to' +
'illustrate my example';
Eu tentei fazer algo semelhante em Python, mas não funcionou, então eu costumava \
dividir a cadeia longa. No entanto, não tenho certeza se essa é a única / melhor / pitônica maneira de fazê-lo. Parece estranho. Código atual:
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
fonte
fonte
Respostas:
Você está falando sobre cadeias de linhas múltiplas? Fácil, use aspas triplas para iniciá-las e finalizá-las.
Você também pode usar aspas simples (3 delas no início e no final) e tratar a sequência resultante
s
como qualquer outra sequência.NOTA : Assim como em qualquer string, qualquer coisa entre as aspas inicial e final torna-se parte da string, portanto, este exemplo tem um espaço em branco à esquerda (conforme indicado por @ root45). Essa sequência também conterá espaços em branco e novas linhas.
Ou seja:
Finalmente, também é possível construir longas filas em Python assim:
que não incluirá espaços em branco extras ou novas linhas (este é um exemplo deliberado que mostra em que resultado o efeito de pular espaços em branco):
Não são necessárias vírgulas, basta colocar as cadeias a serem unidas entre parênteses e certifique-se de levar em conta quaisquer espaços em branco e novas linhas necessários.
fonte
+
operador não faz a concatenação acontecer em tempo de execução?textwrap.dedent
para remover espaços em branco indesejados. docs.python.org/3/library/textwrap.html#textwrap.dedentSe você não deseja uma sequência de linhas múltiplas, mas apenas possui uma cadeia de linhas única longa, pode usar parênteses, mas não incluir vírgulas entre os segmentos da sequência, será uma tupla.
Em uma instrução SQL como a que você está construindo, cadeias de linhas múltiplas também seriam boas. Mas se o espaço em branco extra que uma sequência multilinha contiver seria um problema, seria uma boa maneira de conseguir o que você deseja.
fonte
,
'
?.format(...)
após o parêntese de fechamento.%
notação formatação deve trabalhar também, mas eu não tentei' foo '+variable
, não funcionará, mas' foo '+variable+''
funcionará.Quebrar linhas por
\
obras para mim. Aqui está um exemplo:fonte
longStr = "account: " + account_id + \ ...
the backslash is redundant between brackets
quando escrevi no interiorprint()
Fiquei feliz com este:
fonte
.replace('\t','')
Descobri que, ao criar seqüências longas, você geralmente está fazendo algo como criar uma consulta SQL; nesse caso, é melhor:
O que Levon sugeriu é bom, mas pode estar vulnerável a erros:
fonte
Você também pode concatenar variáveis ao usar a notação "" ":
EDIT: Encontrei uma maneira melhor, com parâmetros nomeados e .format ():
fonte
Essa abordagem usa:
apenas uma barra invertida para evitar um avanço de linha inicialtextwrapinspect
account_id
edef_id
variáveis.Este caminho me parece o mais pitônico.
Atualização : 29/01/2019 Incorpore a sugestão do @ ShadowRanger de usar em
inspect.cleandoc
vez detextwrap.dedent
fonte
inspect.cleandoc
é ligeiramente mais agradável do quetextwrap.dedent
, uma vez que não requer a primeira linha a ser vazio com um carácter de continuação de linha no final.inspect.cleandoc
isso.Em Python> = 3.6, você pode usar literais de string formatada (string f)
fonte
Por exemplo:
se o valor da condição deve ser uma sequência, você pode fazer o seguinte:
fonte
Acho
textwrap.dedent
o melhor para seqüências longas, como descrito aqui :fonte
Outros já mencionaram o método entre parênteses, mas eu gostaria de acrescentar que, entre parênteses, comentários embutidos são permitidos.
Comente sobre cada fragmento:
Comentário não permitido após continuação:
Ao usar continuações de linha de barra invertida (
\
), comentários não são permitidos. Você receberá umSyntaxError: unexpected character after line continuation character
erro.Melhores comentários para as seqüências de caracteres Regex:
Com base no exemplo de https://docs.python.org/3/library/re.html#re.VERBOSE ,
fonte
Pessoalmente, acho a seguinte a melhor (simples, segura e Pythonic) maneira de escrever consultas SQL brutas em Python, especialmente ao usar o módulo sqlite3 do Python :
Prós
Contras
?
espaço reservado, pode ser um pouco difícil controlar qual?
deve ser substituído por qual variável Python quando houver muitas na consulta.fonte
cursor.execute(query.format(vars))
. Isso deve cuidar do seu único "engodo" (espero).format
seria bom usar , mas não tenho certeza se a string de consulta formatada dessa maneira estaria protegida contra injeção de SQL.cursor.execute(query.format(vars))
não lucra mais com as instruções preparadas, fica vulnerável a muitos tipos de problemas, começando com o fato de que, se os parâmetros não forem apenas números, você precisará citá-los duas vezes na consulta SQL.Eu costumo usar algo como isto:
Se você deseja remover espaços em branco irritantes em cada linha, faça o seguinte:
fonte
textwrap.dedent
função do Python , que está na biblioteca padrão, e tem a funcionalidade que você precisa.inspect.cleandoc
é um pouco melhor (menos meticuloso sobre se o texto aparece ou não na mesma linha que as aspas abertas, não requer caracteres explícitos de continuação de linha).Seu código real não deve funcionar, faltam espaços em branco no final de "linhas" (por exemplo
role.descr as roleFROM...
:)Há citações triplas para sequência de várias linhas:
Ele conterá as quebras de linha e espaços extras, mas para SQL isso não é um problema.
fonte
Você também pode colocar a instrução sql em um arquivo separado
action.sql
e carregá-la no arquivo py comPortanto, as instruções sql serão separadas do código python. Se houver parâmetros na instrução sql que precisem ser preenchidos com python, você poderá usar a formatação de strings (como% s ou {field})
fonte
Maneira "à la" Scala (mas acho que é a maneira mais pitônica que o OQ exige):
Se você deseja str final sem linhas de salto, basta colocar
\n
no início do primeiro argumento do segundo substituir:Nota: a linha branca entre "... modelos". e "Além disso, ..." requer um espaço em branco após o
|
.fonte
tl; dr: use
"""\
e"""
para quebrar a sequência , como emNa documentação oficial do python :
fonte
Ei, tente algo como esta esperança que funcione, como neste formato, você retornará uma linha contínua, como você perguntou com sucesso sobre essa propriedade`
fonte
Eu uso uma função recursiva para criar consultas SQL complexas. Essa técnica geralmente pode ser usada para criar cadeias grandes, mantendo a legibilidade do código.
PS: Dê uma olhada na incrível biblioteca python-sqlparse para imprimir consultas SQL, se necessário. http://sqlparse.readthedocs.org/en/latest/api/#sqlparse.format
fonte
Outra opção que eu acho que é mais legível quando o código (por exemplo, variável) é recuado e a string de saída deve ser um liner (sem novas linhas):
fonte
Use aspas triplas. As pessoas costumam usá-las para criar documentos no início dos programas para explicar seus propósitos e outras informações relevantes para sua criação. As pessoas também as usam em funções para explicar o objetivo e a aplicação das funções. Exemplo:
fonte
Eu gosto dessa abordagem porque privilegia a leitura. Nos casos em que temos longas cordas, não há como! Dependendo do nível de indentação em que você se encontra e ainda limitado a 80 caracteres por linha ... Bem ... Não há necessidade de dizer mais nada. Na minha opinião, os guias de estilo python ainda são muito vagos. Adotei a abordagem @Eero Aaltonen, porque privilegia a leitura e o bom senso. Entendo que os guias de estilo devem nos ajudar e não tornar nossa vida uma bagunça. Obrigado!
fonte
Na documentação oficial do python :
fonte
Para definir uma string longa dentro de um dict, mantendo as novas linhas, mas omitindo os espaços , acabei definindo a string em uma constante assim:
fonte
Como uma abordagem geral para seqüências longas em Python, você pode usar aspas triplas
split
ejoin
:Resultado:
Com relação à pergunta do OP relacionada a uma consulta SQL, a resposta abaixo desconsidera a correção dessa abordagem na criação de consultas SQL e se concentra apenas na criação de cadeias longas de maneira legível e estética, sem importações adicionais. Também desconsidera a carga computacional que isso implica.
Usando aspas triplas, construímos uma string longa e legível, que depois dividimos em uma lista
split()
, eliminando o espaço em branco e juntando-a novamente' '.join()
. Finalmente, inserimos as variáveis usando oformat()
comando:Produz:
Edit: Esta abordagem não está de acordo com o PEP8, mas acho útil às vezes
fonte
Geralmente, eu uso
list
ejoin
para comentários / linhas com várias linhas.você pode usar qualquer sequência para juntar todo esse elemento da lista como '
\n
' (nova linha) ou ',
' (vírgula) ou '' (espaço)
Felicidades..!!
fonte