Qual é o recuo adequado para seqüências multilinhas Python dentro de uma função?
def method():
string = """line one
line two
line three"""
ou
def method():
string = """line one
line two
line three"""
ou alguma outra coisa?
Parece meio estranho ter a string pendurada fora da função no primeiro exemplo.
method.__doc__
não é modificado pelo próprio Python mais do que qualquer outrostr
literal.Respostas:
Você provavelmente deseja alinhar com o
"""
Como as novas linhas e os espaços estão incluídos na própria string, você deverá processá-la posteriormente. Se você não quiser fazer isso e tiver muito texto, pode armazená-lo separadamente em um arquivo de texto. Se um arquivo de texto não funcionar bem para o seu aplicativo e você não quiser pós-processamento, eu provavelmente usaria
Se você deseja pós-processar uma sequência de múltiplas linhas para aparar as partes desnecessárias, considere o
textwrap
módulo ou a técnica para pós-processamento de documentos apresentados no PEP 257 :fonte
trim()
função especificada no PEP257 é implementada na biblioteca padrão comoinspect.cleandoc
.string
paratext
ou algo de tamanho diferente, será necessário atualizar o recuo de literalmente todas as linhas do cadeia de múltiplas linhas apenas para que ela corresponda"""
corretamente. Estratégia de recuo não deve complicar refatora futuros / manutenção, e é um dos lugares que PEP realmente falharA
textwrap.dedent
função permite que você comece com o recuo correto na fonte e, em seguida, retire-o do texto antes de usá-lo.A desvantagem, como observado por alguns outros, é que essa é uma chamada de função extra no literal; leve isso em consideração ao decidir onde colocar esses literais no seu código.
O final
\
do literal da mensagem de log é garantir que a quebra de linha não esteja no literal; dessa forma, o literal não começa com uma linha em branco e, em vez disso, começa com a próxima linha completa.O valor de retorno de
textwrap.dedent
é a sequência de entrada com todo o recuo de espaço em branco inicial comum removido em cada linha da sequência. Portanto, olog_message
valor acima será:fonte
textwrap.dedent()
chamada é um valor constante, assim como seu argumento de entrada.def foo: return foo.x
depois na próxima linhafoo.x = textwrap.dedent("bar")
.Use
inspect.cleandoc
assim:O recuo relativo será mantido conforme o esperado. Conforme comentado abaixo, se você deseja manter as linhas vazias anteriores, use
textwrap.dedent
. No entanto, isso também mantém a primeira quebra de linha.fonte
inspect.cleandoc
existe desde o Python 2.6 , que foi em 2008 ..? Absolutamente a resposta mais limpo, especialmente porque ele não usa o estilo recuo deslocado, o que só desperdiça uma quantidade desnecessária de espaçoUma opção que parece faltar nas outras respostas (mencionada apenas no fundo por um comentário de naxa) é a seguinte:
Isso permitirá o alinhamento adequado, unirá as linhas implicitamente e ainda manterá a mudança de linha, o que, para mim, é uma das razões pelas quais eu gostaria de usar seqüências de múltiplas linhas de qualquer maneira.
Não requer pós-processamento, mas você precisa adicionar manualmente o
\n
local em que deseja que a linha termine. Inline ou como uma sequência separada depois. O último é mais fácil de copiar e colar.fonte
Mais algumas opções. No Ipython com o pylab ativado, dedent já está no espaço para nome. Eu verifiquei e é do matplotlib. Ou pode ser importado com:
Na documentação, afirma que é mais rápido que o equivalente a textwrap e, nos meus testes no ipython, é de fato três vezes mais rápido, em média, nos meus testes rápidos. Ele também tem o benefício de descartar qualquer linha em branco inicial, permitindo que você seja flexível na maneira como constrói a string:
O uso da dedução do matplotlib nesses três exemplos fornecerá o mesmo resultado sensato. A função dedent de quebra de texto terá uma linha em branco à esquerda com o 1º exemplo.
A desvantagem óbvia é que o textwrap está na biblioteca padrão enquanto o matplotlib é um módulo externo.
Algumas desvantagens aqui ... as funções dedent tornam seu código mais legível onde as strings são definidas, mas requerem processamento posterior para obter a string no formato utilizável. Nas docstrings, é óbvio que você deve usar o recuo correto, pois a maioria dos usos da docstring fará o processamento necessário.
Quando eu preciso de uma sequência não longa no meu código, encontro o seguinte código confessamente feio, em que deixo a sequência longa sair do recuo anexo. Definitivamente falha em "Bonito é melhor que feio.", Mas alguém poderia argumentar que é mais simples e mais explícito do que a alternativa dedente.
fonte
Se você deseja uma solução rápida e fácil e evita digitar novas linhas, pode optar por uma lista, por exemplo:
fonte
eu prefiro
ou
fonte
Meus dois centavos, escapam do final da linha para obter os recuos:
fonte
Eu vim aqui procurando um liner simples para remover / corrigir o nível de identificação do docstring para impressão, sem torná-lo desarrumado , por exemplo, deixando-o "fora da função" dentro do script.
Aqui está o que eu acabei fazendo:
Obviamente, se você estiver recuando com espaços (por exemplo, 4) em vez da tecla tab, use algo como isto:
E você não precisa remover o primeiro caractere se quiser que seus documentos sejam assim:
fonte
A primeira opção é a boa - com recuo incluído. É no estilo python - fornece legibilidade para o código.
Para exibi-lo corretamente:
fonte
Depende de como você deseja que o texto seja exibido. Se você quiser que tudo fique alinhado à esquerda, formate-o como no primeiro trecho ou faça uma iteração pelas linhas, aparando à esquerda todo o espaço.
fonte
Para seqüências de caracteres, você pode processar a sequência logo após. Para documentos, você precisa depois processar a função. Aqui está uma solução para ambos que ainda é legível.
fonte
inspect.cleandoc
- que fazem isso da maneira certa.Estou tendo um problema semelhante, o código ficou realmente ilegível usando multilinhas, eu criei algo como
sim, no começo poderia parecer terrível, mas a sintaxe incorporada era bastante complexa e adicionar algo no final (como '\ n "') não era uma solução
fonte
Você pode usar esta função trim_indent .
Resultado:
fonte