fstrings.wtf
(fstrings.wtf)- fstrings.wtf é um quiz online para avaliar sua compreensão do recurso de f-strings do Python
- É composto por perguntas que testam os diversos comportamentos e casos de exceção das f-strings aplicados na versão mais recente, Python 3.13
- O usuário pode começar o quiz imediatamente sem passar por nenhum processo adicional
- Permite experimentar com antecedência truques e comportamentos inesperados relacionados a f-strings que aparecem com frequência no trabalho prático
1 comentários
Comentários do Hacker News
Recursos de interpolação de strings são como inferência de tipos: depois que você se acostuma, fica muito incômodo quando não existem. Parece que, conforme vão sendo adicionados aos poucos, ficam cada vez melhores, mas em algum momento você percebe que o código acabou ficando difícil de ler. Em geral, na área de CS, sempre queremos adicionar mais funcionalidades, mas matematicamente isso às vezes é difícil. Aqui, é preciso evitar tanto a ausência total quanto o excesso. Python e C# escolheram deixar isso ao gosto do usuário. Você pode escrever uma string de interpolação complexa de 16 páginas, mas seus colegas podem odiar isso, e ela pode ser rejeitada no code review. C++ 23 adota um estilo que proíbe interpolação desde o início. Rust escolheu uma opção bem limitada, permitindo interpolar apenas identificadores, e isso pode parecer insuficiente para algumas pessoas e excessivo para outras
Acho que a equipe de String Template do Java passou por algo parecido. À primeira vista parecia um sistema muito elegante, mas ao tentar usar de verdade, perceberam que a direção era inviável e acabaram removendo tudo por completo. Considerando a demanda por interpolação e todo o esforço já investido até agora, foi uma decisão bem interessante. No fim, concluíram que não dava para voltar atrás e resolveram retornar ao ponto de partida
Pureza e pragmatismo entram em conflito, e cada linguagem acaba encontrando um ponto de equilíbrio diferente. Como não existe resposta certa, os desenvolvedores continuam insistindo repetidamente que cada um tem seu próprio critério correto
Sempre que preciso formatar números ou datas em C#, acabo indo primeiro à documentação. Essa mini linguagem é tão ruim que decidi não me dar ao trabalho de decorá-la
Não foi difícil controlar a interpolação de forma adequada sem precisar encaixar exemplos complexos. Nunca senti necessidade de aninhar f-strings dentro de f-strings, e o único especificador de formato que uso com frequência é
:02xNão acho que o modo limitado de interpolação do Rust seja solução nenhuma. Como só funciona em certas situações, você precisa ficar pensando nisso o tempo todo ao refatorar código, e isso gera trabalho desnecessário. No mínimo, acho que acesso a campos deveria ser permitido. Já em Python, mesmo existindo casos estranhos como os do exemplo, quem usa na prática não se importa com isso e simplesmente usa f-string numa boa
Recentemente descobri algumas dicas explicadas em fstring.help, como alinhamento centralizado, prefixos 0x/0b/0o e exibição em ASCII. Também tinha curiosidade sobre o problema de f-strings aninhadas, e até a 3.11 isso era possível usando apenas aspas diferentes. Pelo que sei, várias restrições foram organizadas na 3.12. Graças às f-strings, isso ficou conveniente, mas ter de alternar com frequência entre a formatação antiga com
%, o método .format() e as diferenças sutis do novo estilo é mais incômodo do que parece, e situações inevitáveis aparecem com frequência. A usabilidade melhorou, mas ainda é frustrante quando você precisa usar o estilo antigoDá para confirmar essa reorganização na 3.12 na documentação oficial
Às vezes vejo colegas ou IA usando f-string em chamadas de logger, mas logger faz lazy interpolation justamente de propósito, então acho estranho abrir mão dessa vantagem tão boa
Acho que f-string aninhada é um problema meio de truque. Sabia que passou a ser possível aninhar com o mesmo estilo de aspas, mas não sabia em que versão. Ainda uso o truque
f'{f"{}"}'porque quero que meu código continue suportando versões um pouco mais antigas do PythonFoi a primeira vez que descobri o recurso do sinal de igual (
=) em f-string para exibir a expressão e o valor juntosAcho que as notas de lançamento do Python realmente valem a leitura. Sempre há surpresas positivas. O recurso do sinal de igual foi adicionado no Python 3.8 link relacionado
É uma pena que um PEP parecido não tenha sido adotado também para argumentos nomeados de funções. Em vez de
foo(bar=bar), algo comofoo(bar=)teria deixado mais clara a diferença entre simplesmente passar um argumento e outras situações, além de ser eficiente para depuraçãoAcho que é um recurso que surpreende mais do que entrega valor suficiente. Como pode se comportar de forma inesperada, me preocupo que vire fonte de bugs. Talvez fosse melhor uma função padrão que imprimisse apenas parte de
locals()É um padrão usado com muita frequência em saídas de depuração. Em C++, peguei o hábito de deixar uma expressão entre aspas e outra não. Fica fácil de entender e é bom porque não exige pensar muito
É realmente útil ao depurar com
print(f)Ao contrário da URL, acho que quase não há perguntas realmente nível WTF. Algumas são realmente surpreendentes, como as perguntas 20 e 21
Eu acho o walrus operator útil demais para abrir mão dele. Com pattern matching e tratamento de múltiplos ramos, o código fica muito mais limpo. Não uso com frequência, mas quando a situação é ideal ele tem bastante efeito
Isso não é por causa do walrus operator, e sim por causa da forma como
pythontratastring.formatveja a documentaçãoNão usei Python a sério antes e depois da introdução de f-strings, mas acertei quase todas as regras de sintaxe, e os únicos erros que cometi algumas vezes tinham mais a ver com retorno de valores. Chego a pensar que f-string talvez seja uma das partes menos WTF do Python
Ao criar uma biblioteca parecida com f-string para Lua, aprendi bastante sintaxe, mas
f"{...}"e o walrus operator eu não esperava. Ainda assim, está longe do nível de estranheza de Wat. A biblioteca relacionada está aquiNão acho que haja nada especialmente WTF aqui. Grande parte do conteúdo é mais sobre a sintaxe da mini linguagem de
str.format()do que sobre f-stringParece que há funcionalidades demais e que passou do ponto crítico. Não é necessário que um único desenvolvedor saiba tudo, e na prática é ineficiente ter de consultar a documentação sempre que precisar usar. Como se usa raramente, você acaba esquecendo a sintaxe, e implementar a mesma coisa manualmente costuma ser muito mais rápido, com a vantagem de ser mais fácil para colegas customizarem também. Left padding? Uma função de 2 linhas já resolve. Em vez de ficar confuso com a ordem da sintaxe de formatação (
nvem antes de<ou o contrário?), é mais rápido fazer um ad-hoc diretoCoisas como left padding também podem ser usadas no método
string.format, e esse estilo já existia desde o Python 2.6 (lançado em 2008) veja a documentação. No meu caso, a sintaxe de formatação até fica bem na cabeça e eu a uso de forma útil. Além disso, a formatação abre hooks para customizaçãoEu preferiria um meio-termo. Seria mais agradável ter funções
pad_left/pad_rightem que o caractere de preenchimento também pudesse ser passado diretamente como argumento nomeado. Como é algo necessário no dia a dia de vez em quando, seria bom se estivesse na biblioteca padrão. Quando a biblioteca da linguagem não tem algo assim, depois cada projeto acaba cheio de implementações ruins, como acontece com JavaScript. No meu projeto talvez eu nunca use formatação em Python com^ou<>, mas em software em que a saída em 'monoespaçado' é importante, isso pode ser uma funcionalidade extremamente importanteÀs vezes há recursos estranhos ou gambiarra que acabam sendo usados repetidamente dentro de um mesmo codebase. Você faz uma vez, copia e cola, e continua reutilizando
Se essa sintaxe fosse de JavaScript, a maioria estaria reclamando que é sintaxe pouco intuitiva e cheia de recursos estranhos
Na minha opinião, a verdadeira tese desse quiz é mostrar que Python também tem tantos footguns quanto JavaScript. Talvez seja porque esse tipo de postagem 'WTF' aparece com frequência no mundo JS
Mesmo tirando os truques menores, acho que JavaScript continua sendo de longe o rei da sintaxe pouco intuitiva. Os elementos de f-string do Python também são peculiares, mas só aparecem em situações específicas; em JS, antes mesmo de comparar dois arrays, você já está esperando instalar dependências
Queria perguntar sobre template literals do JavaScript. Ao que parece, diferente do Python, não dá para fazer algo como
let template = 'hello ${name}';e depois preencher dinamicamente várias vezes com valores tipotemplate.format({ name: 'joe' })no JS. Então fui obrigado a implementar isso por conta própria. Também olhei tagged templates e afins, mas reutilizar o template em si parecia difícil. Entendo totalmente reclamar da sintaxe e dos recursos esquisitos de JSSe fosse Perl, provavelmente estariam elogiando
Eu consulto o pyformat.info(link); não é absurdamente detalhado, mas cobre praticamente todos os exemplos razoáveis