Перейти к основному содержимому

Руководство по созданию чудовищных однострочников на Python

··458 слов·3 минут

Один хороший человек на днях скинул мне страшнющий однострочник на Python, а затем сотворил вот это руководство.

Пользуйтесь и наслаждайтесь… Если сможете :)

@denizsincar29, спасибо тебе!

Руководство по созданию чудовищных, но эффектных однострочников

Цель: уместить максимальное количество логики и операций в одну строку кода, жертвуя читаемостью, поддерживаемостью и безопасностью.

Наша цель - создать код, который никто не сможет понять, кроме самого гения-автора. Да и то не факт.

Основные принципы

  • Забудьте про обработку исключений: ошибки - это весело! Пусть программа взрывается. Обработать исключения в однострочнике невозможно, поэтому мы не будем даже пытаться.

  • Комбинируйте всё воедино (максимально): вложенные тернарные операторы, цепочки методов, скобки внутри скобок - чем больше операций в одном выражении, тем лучше.

a if cond1 else (b if cond2 else c)

Ваш лучший друг.

a or b and c

Тоже полезно для создания неочевидной логики.

  • Лист-компрехеншены - наше многофункциональное оружие: превратите любой цикл и фильтрацию данных в однострочный ад. Используйте вложенные лист-компрехеншены для максимальной сложности. Да и цикл в одну строку вы не напишете.

  • Мгновенная индексация - для краткости и скорости: создайте список/словарь на лету и сразу же получите к нему доступ по индексу/ключу.

    [...][i]

    и

    {...}[key]

    позволяют избежать временных переменных и сделать код более лаконичным. Убедитесь, что i и key вычисляются в других сложных выражениях, чтобы увеличить уровень абстракции.

  • Импортируйте не как все (для obfuscation):

    __import__("module").submodule.function()

    Это не только красиво, но и затрудняет анализ зависимостей.

  • Циклы через itertools (для бесконечной мощи): забудьте про обычные for.

    __import__("itertools").count()

    и map() с лямбдами позволяют создавать бесконечные циклы, которые могут привести к зависанию программы, если их не остановить.

  • Больше тернарных операторов (для нелинейной логики): выведите тернарные операторы на новый уровень, вложив их друг в друга несколько раз. Используйте их даже там, где они не нужны, чтобы добавить немного загадочности.

  • Главное - уместить как можно больше: каждая строка должна быть наполнена операциями до предела. Используйте все доступные приемы, чтобы уменьшить количество символов и увеличить плотность логики.

Пример

Пример, стремящийся к абсолютной нечитаемости:

monthdays = lambda year, month: [31, (29 if (((year % 4) == 0) and ((year % 100) != 0) or ((year % 400) == 0)) else 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][(["январь", "февраль", "март", "апрель", "май", "июнь", "июль", "август", "сентябрь", "октябрь", "ноябрь", "декабрь"].index(month.strip().lower()))] # Возвращает количество дней в месяце для заданного года (или взрывается с ошибкой). Не пытайтесь понять, как это работает.

Полезные применения и предостережения

  • Конкурсы на самый нечитаемый код, где побеждает тот, кто умудрится сделать больше всего в одной строке.
  • Демонстрация мнимого мастерства владения языком. Если кто-то действительно впечатлится, вам повезло.
  • Запутывание врагов. Только если вы уверены, что они не смогут использовать ваш код против вас.

Важное предупреждение

Этот код предназначен только для развлечений и экспериментов!

Вы можете конечно использовать такой код на работе, если ваша цель - отомстить вашему работодателю перед увольнением.

Кирилл Белоусов
Автор
Кирилл Белоусов
Также известен как cyrmax. Пишу код, тестирую, автоматизирую инфраструктуру и помогаю делать цифровые продукты доступнее.