Por que o método 'format' não é mais amplamente usado no Python?

8

Provavelmente estou perdendo alguma coisa aqui, depois de pesquisar não consegui encontrar uma resposta.

Eu explorei alguns projetos Python e uma coisa que eu continuo percebendo é o fato de que a maioria deles continua a usar o %operador para formatar seqüências de caracteres, em vez do .format()método mais novo e recomendado . Existe uma razão para isso? parece uma mudança trivial, a menos que eu esteja perdendo algo completamente.

Por exemplo:

# count how many times the % operator technique is used
find . -name "*.py" -exec grep -HE "\"[^\"]+\"\s\%\s\w+|'[^']+'\s\%\s\w+" {} \; | wc -l

# and the same for format()
find . -name "*.py" -exec grep -HE "\w+\.format\(" {} \; | wc -l

# Results:
#
#               % operator        format()
# iPython          670               63
# Django           977               8
# Tornado          91                0
# requests         25                1

Não há razão real para esta pergunta, apenas curioso.

Saúde Gente!

Matt
fonte
2
As pessoas gostam de digitar menos e também têm código que foi escrito antes de haver um .format()método?
Wooble
FWIW, o antigo %é mais eficiente e menos detalhado para substituições simples de strings. Eu o uso na maioria das vezes, e quando preciso de uma formatação mais poderosa .format
opto

Respostas:

16

Três inclinações extremamente fortes se unem para produzir esse efeito:

  1. Conforto: "Eu sei como fazer isso da maneira antiga, aprender a nova maneira seria mais esforço".
  2. trade-off de esforço / efeito: "O método antigo desapareceu? Ele está obsoleto? Não? Então não há nenhum caso comercial para alterar isso. Crie um novo código".
  3. Segurança: "Você tem certeza de que a nova maneira proposta de fazer as coisas é exatamente equivalente? Não? Então é melhor deixar o código antigo como está - você pode apresentar defeitos".

Todos os três são, de fato, bastante sensatos (o primeiro menos, pois o aprendizado contínuo é o que os profissionais da informação devem prosperar).

( Edit: Como apontado abaixo, existe um quarto ponto: não saber que o novo método existe! Isso é menos sensato, mas pode realmente ser o mais comum.)

Kilian Foth
fonte
4
+1, talvez haja 4. ignorância de que existe um novo caminho
jk.
1
@jk. +1 Eu não sabia que o formato () existia.
Joe Z.
+1, mas inclua esse 4º ponto. Percebo repetidamente que SO, sempre que mostro o .format()método ou a format()função, as pessoas simplesmente não sabem que elas existem .
Martijn Pieters
1
Eu acrescentaria que nãoformat é equivalente a . Por exemplo, usando você pode usar para especificar a largura mínima do campo (por exemplo, formata o flutuador com pelo menos dígitos), enquanto você não pode fazer isso. E provavelmente existem outras coisas que podem fazer enquanto não podem. %%*'%.*f' % (7, 2.34)2.347formatformat%
Bakuriu 21/02
3
Ótima resposta. Além disso, @Bakuri é possível format, mas não é tão conciso - "{0:.{1}f}".format(2.34, 7). Eu não encontrei nada %pode fazer isso formatnão pode.
21413 Matt
6

Além dos outros motivos, eu acrescentaria compatibilidade e consistência com versões anteriores. Geralmente, você precisa escrever scripts que possam ser executados nos computadores de outras pessoas, que não desejam ou não podem atualizar para o Python mais recente e melhor. Então você escreve para o menor denominador comum. No momento em que um número suficiente de usuários atualizou para uma versão suficientemente recente do Python, você provavelmente já esqueceu quais recursos apareceram em qual versão do Python. A menos que sejam recursos excepcionalmente valiosos, pode não valer a pena pesquisar, considerar e decidir se agora é seguro usar cada recurso. O método method format é uma API agradável para usar em novo código, mas o argumento para introduzi-lo em uma base de código que já usa% extensivamente não é tão forte.

Weeble
fonte
2

Ao desenvolver software para seu próprio uso, geralmente é de seu benefício usar versões mais recentes de suas bibliotecas e ferramentas de desenvolvimento. No entanto, os projetos que você está vendo são bibliotecas e ferramentas de desenvolvimento que devem ser compartilhadas com a comunidade. Nesses casos, você deseja ser conservador nos recursos necessários para obter a base instalada mais ampla e obter o máximo de pessoas envolvidas no projeto.

O format()método não foi adicionado até o lançamento do Python 3.0 / 2.6 em 2008. Isso parece há muito tempo, mas lembre-se de que as pessoas raramente usam o primeiro lançamento do software. Vamos colocar isso no contexto de quando ele ficou disponível em duas das distribuições Linux mais "sérias". O RHEL 5.x ainda usa o Python 2.4 e é suportado até 2017 - o 6.x tem o Python 2.6, mas não foi lançado até 2010. No campo Debian, eles não tinham o Python 2.6 até a série 6.x, que se tornou estável em 2011.

Portanto, embora possa fazer sentido, se você estivesse iniciando um projeto como o Django (lançado originalmente em 2005) hoje, para padronizar o novo método, há muito pouco valor em voltar e alterar todas as 1000 ocorrências do método antigo sem que ele tenha foi formalmente reprovado. Faz trabalho, cria a possibilidade de introduzir bugs e aumenta desnecessariamente os requisitos do sistema.

Sean McSomething
fonte
0

Adição à resposta de @ KilianFoth; portar um grande projeto para uma versão superior do software tem muito trabalho a fazer. E alterar um uso não reprovado tem a menor importância no processo de atualização.

Provavelmente eles estão usando um novo formato em partes totalmente reescritas e não alteram o uso existente nos demais.

Anjo caído
fonte