Fetichismo de uma linha 🤖

Hoje temos mais uma tentativa de enfiar o impossível em uma única linha, encontrada na internet. Olhando para isso, os linters não apenas reclamam — eles se desinstalam do seu dispositivo.

with open("t") as f:print(sum([sum([float(m) for m in "".join(filter(lambda x:x.isnumeric() or x.isspace() or x==".",l)).split()]) for l in f.readlines()]))


🧐 O que está acontecendo aqui?
O autor desta "obra-prima" se propôs a tarefa: extrair todos os números de um arquivo de texto e somá-los.

Por que isso causa dor física?
1️⃣ Memória não é elástica. f.readlines() despeja o arquivo inteiro na RAM. Se o arquivo tem 10 GB — seu servidor dirá "tchau" mais rápido do que você termina de ler este post.
2️⃣ Filtragem caractere por caractere via lambda. Juntar a string caractere por caractere com "".join(filter(...)) é a forma mais lenta de processar strings em Python. Estamos programando ou enfiando contas?
3️⃣ Compreensões de lista aninhadas. Legibilidade no nível de hieróglifos egípcios. Para entender onde um parêntese fecha, é preciso chamar um exorcista.
4️⃣ PEP8 saiu do chat. Ausência de espaços após : e ao redor de operadores não é economia de espaço, é desrespeito aos outros.

Conclusão: Obtivemos um código que funciona devagar, consome memória e é absolutamente ilegível.

Como fazer de forma humana?
Se você precisa extrair números de um texto, para isso existem expressões regulares.
Veja como esse código deveria ser no mundo de uma pessoa sã:

import re

def total_sum_from_file(file_path: str) -> float:
total = 0.0
# Usamos gerenciador de contexto e iterador por linhas
with open(file_path, 'r', encoding='utf-8') as f:
for line in f:
# Procuramos tudo que se parece com número (inteiro ou com ponto)
numbers = re.findall(r"[-+]?\d*\.\d+|\d+", line)
total += sum(map(float, numbers))
return total

print(total_sum_from_file("t.txt"))


Por que é melhor assim:
1. Legibilidade: Até um júnior entenderá o que está acontecendo em 5 segundos.
2. Memória: Lemos o arquivo linha por linha. Se o arquivo pesa 10 GB, este código não vai cair.
3. Velocidade: re.findall em nível C funciona mais rápido que seu filtro caractere por caractere em Python.

#código_fumante