Skip Navigation
Telegram
Парсим рецепты из Minecraft в одну строку 🤪
Парсим рецепты из Minecraft в одну строку 🤪

Есть священный обряд, который каждый программист должен пройти хотя бы раз в жизни: написать абсолютно нечитаемый, но работающий однострочник со сложной логикой внутри. Не потому что надо, а потому что можешь.

Чел с реддит захотел распарсить рецепты из ванильного Minecraft и вот, что получилось:

out2in = {k: ([("#" + x["tag"] if x.get("tag") else x["item"]) if x.class.name == "dict" else [("#" + y["tag"] if y.get("tag") else y["item"]) for y in x] for x in v]) for (k, v) in {(y["result"]["item"] if y["result"].class.name == "dict" else y["result"]): ((y["ingredients"] if y["ingredients"].class.name == "list" else ([y["ingredients"]]) if y.get("ingredients") else y["ingredient"]) if y.get("ingredients") else [z for z in y["key"].values()]) for y in filter(lambda x: x.get("result") and (x.get("ingredients") or x.get("key")), [json.load(open(x, "rt")) for x in Path("recipes").glob("*.json")])}.items()}


Что мы здесь видим? Дзен Питона, который вышел покурить и не вернулся. В одном флаконе смешаны:
- Вложенные дикт-компрехеншены
- Вложенные лист-компрехеншены
- Тернарные операторы в качестве основной логики
- filter с lambda-функцией
- И все это для парсинга JSON разной структуры.

Автор честно признался: "this took ages to debug..." (на отладку ушла вечность). И сделал он это, цитирую: "just because i can(and am bored)" (просто потому что могу (и мне было скучно)).

Произведение искусства, которое должно висеть в рамке с подписью "НИКОГДА ТАК НЕ ДЕЛАЙТЕ".

#код_курильщика
Telegram
Однострочный фетишизм 🤖
Однострочный фетишизм 🤖

Сегодня у нас очередная попытка впихнуть невпихуемое в одну строку, найденная на просторах интернета. Глядя на это, линтеры не просто ругаются — они выпиливают себя с вашего устройства.

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


🧐 Что здесь происходит?
Автор этого «шедевра» поставил себе задачу: извлечь все числа из текстового файла и просуммировать их.

Почему это вызывает физическую боль?
1️⃣ Память — не резиновая. f.readlines() вываливает весь файл в RAM. Если файл на 10 Гб — ваш сервер скажет «пока» быстрее, чем вы дочитаете этот пост.
2️⃣ Посимвольная фильтрация через lambda. Склеивать строку по одному символу через "".join(filter(...)) — это самый медленный способ обработки строк в Python. Мы тут программируем или бисер перебираем?
3️⃣ Вложенные списковые включения. Читаемость на уровне египетских иероглифов. Чтобы понять, где закрывается скобка, нужно вызвать экзорциста.
4️⃣ PEP8 вышел из чата. Отсутствие пробелов после : и вокруг операторов — это не экономия места, это неуважение к окружающим.

Итог: Мы получили код, который работает медленно, жрет память и абсолютно нечитаем.

Как это сделать по-человечески?
Если вам нужно вытащить числа из текста, для этого существуют регулярные выражения.
Вот как этот код должен выглядеть в мире здорового человека:

import re

def total_sum_from_file(file_path: str) -> float:
total = 0.0
# Используем контекстный менеджер и итератор по строкам
with open(file_path, 'r', encoding='utf-8') as f:
for line in f:
# Ищем все, что похоже на число (целое или с точкой)
numbers = re.findall(r"[-+]?\d*\.\d+|\d+", line)
total += sum(map(float, numbers))
return total

print(total_sum_from_file("t.txt"))


Почему так лучше:
1. Читаемость: Даже джун поймет, что здесь происходит, за 5 секунд.
2. Память: Мы читаем файл построчно. Если файл весит 10 Гб, этот код не упадет.
3. Скорость: re.findall на уровне C работает быстрее, чем ваш посимвольный фильтр на Python.

#код_курильщика