Fétichisme de la ligne unique 🤖

Aujourd'hui, nous avons une nouvelle tentative de fourrer l'infourrable en une seule ligne, trouvée sur les vastes étendues d'Internet. En voyant cela, les linters ne se contentent pas de râler — ils se désinstallent de votre appareil.

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()]))


🧐 Que se passe-t-il ici ?
L'auteur de ce « chef-d'œuvre » s'est fixé un objectif : extraire tous les nombres d'un fichier texte et les additionner.

Pourquoi cela provoque-t-il une douleur physique ?
1️⃣ La mémoire n'est pas extensible. f.readlines() déverse tout le fichier dans la RAM. Si le fichier fait 10 Go, votre serveur dira « au revoir » plus vite que vous ne finirez de lire ce post.
2️⃣ Filtrage caractère par caractère via lambda. Concaténer une chaîne caractère par caractère avec "".join(filter(...)) est la manière la plus lente de traiter des chaînes en Python. On programme ou on enfile des perles ?
3️⃣ Compréhensions de listes imbriquées. La lisibilité est au niveau des hiéroglyphes égyptiens. Pour comprendre où se ferme une parenthèse, il faut appeler un exorciste.
4️⃣ PEP8 a quitté le chat. L'absence d'espaces après : et autour des opérateurs n'est pas une économie de place, c'est un manque de respect envers les autres.

Bilan : Nous obtenons un code qui est lent, gourmand en mémoire et totalement illisible.

Comment faire cela de manière humaine ?
Si vous avez besoin d'extraire des nombres d'un texte, il existe les expressions régulières (lien).
Voici à quoi ce code devrait ressembler dans un monde sain :

import re

def total_sum_from_file(file_path: str) -> float:
total = 0.0
# Utilisation d'un gestionnaire de contexte et d'un itérateur de lignes
with open(file_path, 'r', encoding='utf-8') as f:
for line in f:
# Recherche de tout ce qui ressemble à un nombre (entier ou avec point)
numbers = re.findall(r"[-+]?\d*\.\d+|\d+", line)
total += sum(map(float, numbers))
return total

print(total_sum_from_file("t.txt"))


Pourquoi c'est mieux :
1. Lisibilité : Même un débutant comprendra ce qui se passe en 5 secondes.
2. Mémoire : Nous lisons le fichier ligne par ligne. Si le fichier pèse 10 Go, ce code ne plantera pas.
3. Vitesse : re.findall au niveau C est plus rapide que votre filtre caractère par caractère en Python.

#code_du_fumeur