Strings com várias linhas em Python

Recentemente, tive que preparar uma string com várias linhas, contendo o cabeçalho de um e-mail em um programa escrito em Python. Até aí, nenhuma novidade: bastava usar as três aspas para indicar o início e mais três para indicar o fim da string. No entanto, a string estava localizada em um bloco com indentação, o que fez com que a indentação ficasse incluída no conteúdo da string. Para entender melhor o que aconteceu, segue um exemplo:

Chamando essa função no interpretador Python, vem o seguinte resultado:

Como pode ser observado, da segunda linha em diante, a string acaba incluindo as indentações usadas no bloco de código.

O motivo desse comportamento é fácil de ser identificado, já que os espaços em branco estão de fato incluídos na string :-). No entanto, em alguns casos, como no caso de cabeçalhos de e-mail, é necessário que as strings não possuam caracteres em branco no início das linhas, caso contrário o cabeçalho não é interpretado corretamente pelos servidores de e-mail. Nesse caso, a forma mais fácil de corrigir o problema é remover os espaços iniciais da string:

Com essa alteração, o resultado esperado é obtido no teste com o interpretador:

No entanto, o código ficaria muito mais legível (e mais bonito :-P) se fosse possível resolver o problema mantendo a indentação da string. Para isso, pode-se usar a função dedent do módulo textwrap:

A função dedent remove os caracteres de indentação comuns à todas as linhas de uma string. Nesse caso, como todas as linhas possuem quatro espaços iniciais, eles são removidos. Como o dedent só remove a indentação que é comum à todas as linhas, as linhas em branco também devem conter a indentação (como a linha 8). Além disso, vale notar que a primeira linha da string foi deslocada para baixo pare que todas as linhas ficassem com o mesmo espaço de indentação inicial. Com isso, a string acaba sendo iniciada por uma quebra de linha, o que geralmente não é desejado. Para contornar esse problema, foi incluída a barra inversa no início, que serve para fazer com que o caractere seguinte a ela seja ignorado (a quebra de linha).

Com isso, é obtido o resultado esperado:

Apesar do resultado ser o mesmo, acho que vale o trabalho de usar a função dedent para tornar o código mais legível. Para saber mais, veja a página de documentação do textwrap.

About Renato

No Comments

Be the first to start a conversation

Deixar uma Resposta

  • (will not be published)