Python tem pelo menos seis maneiras de formatar uma string:
In [1]: world = "Earth"
# method 1a
In [2]: "Hello, %s" % world
Out[2]: 'Hello, Earth'
# method 1b
In [3]: "Hello, %(planet)s" % {"planet": world}
Out[3]: 'Hello, Earth'
# method 2a
In [4]: "Hello, {0}".format(world)
Out[4]: 'Hello, Earth'
# method 2b
In [5]: "Hello, {planet}".format(planet=world)
Out[5]: 'Hello, Earth'
# method 2c
In [6]: f"Hello, {world}"
Out[6]: 'Hello, Earth'
In [7]: from string import Template
# method 3
In [8]: Template("Hello, $planet").substitute(planet=world)
Out[8]: 'Hello, Earth'
Uma breve história dos diferentes métodos:
printf
a formatação de estilo existe desde a infância de Pythons- A
Template
classe foi introduzida em Python 2.4 - O
format
método foi introduzido no Python 2.6 f
-strings foram introduzidos no Python 3.6
Minhas perguntas são:
- A
printf
formatação -style está obsoleta ou será obsoleta? - No
Template class
, osubstitute
método foi descontinuado ou será descontinuado? (Não estou falando sobre osafe_substitute
que, pelo que entendi, oferece recursos únicos)
Perguntas semelhantes e por que acho que não são duplicatas:
Formatação de string Python:% vs. .format - trata apenas os métodos 1 e 2 e pergunta qual é o melhor; minha pergunta é explicitamente sobre a depreciação à luz do Zen do Python
Opções de formatação de string: prós e contras - trata apenas dos métodos 1a e 1b na pergunta, 1 e 2 na resposta e também nada sobre depreciação
formatação de string avançada versus strings de modelo - principalmente sobre os métodos 1 e 3, e não aborda a suspensão de uso
Expressões de formatação de string (Python) - a resposta menciona que a abordagem original '%' está planejada para ser descontinuada . Mas qual é a diferença entre planejado para ser obsoleto , pendente depreciação e real depreciação ? E o
printf
método -style não gera nem mesmo aPendingDeprecationWarning
, então isso realmente será obsoleto? Este post também é bastante antigo, então as informações podem estar desatualizadas.
Formatter
aula?Respostas:
Embora existam várias indicações nos documentos de que
.format
as strings f são superiores às%
strings, não há nenhum plano remanescente para substituir o último.No commit Problema nº 14123: Mencione explicitamente que a formatação de string% no estilo antigo tem ressalvas, mas não irá desaparecer tão cedo. , inspirado pelo problema Indica que não há planos atuais para descontinuar a formatação do estilo printf , os documentos sobre
%
formatação foram editados para conter esta frase:(Ênfase minha.)
Esta frase foi removida posteriormente, no commit Close # 4966: renovar a documentação da sequência para explicar melhor o estado do Python moderno . Isso pode parecer um sinal de que um plano para descontinuar a
%
formatação estava de volta aos cartões ... mas mergulhar no rastreador de bug revela que a intenção era oposta. No rastreador de bug, o autor do commit caracteriza a mudança assim :Em outras palavras, tivemos duas alterações consecutivas nos
%
documentos -formatting com a intenção de enfatizar explicitamente que não será descontinuado, muito menos removido. Os documentos permanecem opinativos sobre os méritos relativos de diferentes tipos de formatação de string, mas também estão claros que a%
-formatação não será descontinuada ou removida.Além do mais, a alteração mais recente nesse parágrafo , em março de 2017, mudou deste ...
... para isso:
Observe a mudança de "ajuda a evitar" para "pode ajudar a evitar", e como a recomendação clara de
.format
cordas-F foi substituída por uma prosa fofa e equívoca sobre como cada estilo "fornece suas próprias compensações e benefícios" . Ou seja, não apenas uma reprovação formal não está mais nos cartões, mas os documentos atuais estão reconhecendo abertamente que a%
formatação tem pelo menos alguns "benefícios" em relação às outras abordagens.Eu deduzo de tudo isso que o movimento para descontinuar ou remover a
%
formatação não apenas vacilou, mas foi derrotado completa e permanentemente.fonte
%
. Agora que a política de "não usar mods de código em grande escala" foi descartada, suas objeções também estão desaparecendo. No longo prazo, a manutenção de ambos os formulários sem nenhum benefício restante, pois%
em algum ponto a sintaxe do printf será removida de qualquer maneira. Só não sabemos quando ainda, então valia a pena diminuir o tom da linguagem.O novo
.format()
método pretende substituir a%
sintaxe de formatação antiga . O último foi enfatizado, (mas não oficialmente obsoleto ainda ). A documentação do método afirma tanto:(Ênfase minha).
Para manter a compatibilidade com versões anteriores e tornar a transição mais fácil, o formato antigo foi deixado no lugar por enquanto . Da proposta PEP 3101 original :
Observe que até chegar a hora de descontinuar o sistema antigo ; ele não se tornou obsoleto, mas o novo sistema deve ser usado sempre que você escrever um novo código .
O novo sistema tem a vantagem de poder combinar a abordagem de tupla e dicionário do
%
formatador antigo :e é extensível por meio do
object.__format__()
gancho usado para manipular a formatação de valores individuais.Observe que o antigo sistema possuía
%
e aTemplate
classe, onde a última permite criar subclasses que adicionam ou alteram seu comportamento. O sistema de novo estilo temFormatter
classe para preencher o mesmo nicho.Python 3 ainda reforçou longe de depreciação, em vez dando-lhe aviso na
printf
string de formatação de estilo seção :O Python 3.6 também adicionou literais de string formatadas , que alinham as expressões nas strings de formato. Esses são o método mais rápido de criar strings com valores interpolados e devem ser usados em vez de
str.format()
onde você puder usar um literal.fonte
Formatter
você pode criar formatos personalizados, como aqueles que osdatetime
objetos usam. Além disso, como.format
é uma função, você pode usá-la para criar uma formatação lenta que pode ser chamada mais diretamente: por exemplo,fmt = '{} - {}'.format; fmt(a, b)
Template
se relaciona com%
ou com o sistema antigo . Em particular, o PEP que você vincula estados Embora haja alguma sobreposição entre esta proposta estring.Template
, parece que cada uma atende a uma necessidade distinta e que uma não elimina a outra. Em sua resposta, pode ficar confuso que aTemplate
formatação, por fazer parte do sistema antigo , também está obsoleta.Formatter
classe pode preencher as mesmas necessidades questring.Template()
.[...]should be preferred to the % formatting[...]
esta parte foi removida da documentação. docs.python.org/3/library/stdtypes.html#str.formatO
%
operador para formatação de string não é obsoleto e não será removido - apesar das outras respostas.Cada vez que o assunto é levantado na lista de desenvolvimento do Python, há uma forte controvérsia sobre qual é o melhor, mas nenhuma controvérsia sobre se remover a forma clássica - ela permanecerá. Apesar de ser indicado no PEP 3101, o Python 3.1 veio e se foi, e a
%
formatação ainda está por aí.As afirmações para manter o estilo clássico são claras: é simples, é rápido, é rápido para fazer coisas curtas. Usar o
.format
método nem sempre é mais legível - e quase ninguém - mesmo entre os desenvolvedores principais, pode usar a sintaxe completa fornecida por.format
sem ter que olhar para a referência Mesmo em 2009, havia mensagens como esta: http: // mail. python.org/pipermail/python-dev/2009-October/092529.html - o assunto quase não apareceu nas listas desde então.Atualização de 2016
Na versão atual de desenvolvimento do Python (que se tornará o Python 3.6), há um terceiro método de interpolação de string, descrito no PEP-0498 . Ele define um novo prefixo de citação
f""
(além do atualu""
,b""
er""
).Prefixar uma string por
f
chamará um método no objeto string no tempo de execução, que interpola automaticamente as variáveis do escopo atual na string:fonte
__format__
. Por exemplo,format(Decimal('0.1'), '.20f')
vs'%.20f' % Decimal('0.1')
. O último transforma o decimal em ponto flutuante.f
em Python 3?f-strings
usados acima são novos recursos na linguagem a partir do Python 3.6. Ele não existe nas versões anteriores e gerará um erro de sintaxe nelas.A última posição de Guido sobre isso parece estar indicada aqui:
O que há de novo no Python 3.0
E o próprio PEP3101 , que tem a última modificação datada de (Sex, 30 de setembro de 2011), então nenhum progresso até agora, eu suponho.
fonte
Olhando para os documentos Python mais antigos e o PEP 3101, havia uma declaração de que o operador% será descontinuado e removido da linguagem no futuro. A declaração a seguir estava na documentação do Python para Python 3.0, 3.1 e 3.2:
Se você for para a mesma seção nos documentos do Python 3.3 e 3.4, verá que a instrução foi removida. Também não consigo encontrar qualquer outra declaração em qualquer outro lugar na documentação indicando que o operador será descontinuado ou removido do idioma. Também é importante observar que o PEP3101 não é modificado há mais de dois anos e meio (sexta-feira, 30 de setembro de 2011).
Atualizar
PEP461 Adicionar% formatação a bytes e bytearray é aceito e deve fazer parte do Python 3.5 ou 3.6. É outro sinal de que o operador% está vivo e ativo.
fonte