В мире программирования на Python существует особая философия, представляющая собой специальный документ под названием Zen of Python (Дзен Python). Он включает принципы, направленные на написание ясного, простого и элегантного кода на Python. В этой статье мы поговорим об истории создания этого документа, его реализации и пасхалках, связанных с ним.

Текст Дзена Python можно получить, введя строку кода import this:

>>> import this
The Zen of Python, by Tim Peters
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than right now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!

На русский язык принципы Дзена переводятся так:

Красивое лучше, чем уродливое.
Явное лучше, чем неявное.
Простое лучше, чем сложное.
Сложное лучше, чем запутанное.
Плоское лучше, чем вложенное.
Разреженное лучше, чем плотное.
Читаемость имеет значение.
Особые случаи не настолько особые, чтобы нарушать правила.
При этом практичность важнее безупречности.
Ошибки никогда не должны замалчиваться.
Если они не замалчиваются явно.
Встретив двусмысленность, отбрось искушение угадать.
Должен существовать один и, желательно, только один очевидный способ сделать это.
Хотя он поначалу может быть и не очевиден, если вы не голландец.
Сейчас лучше, чем никогда.
Хотя никогда зачастую лучше, чем прямо сейчас.
Если реализацию сложно объяснить — идея плоха.
Если реализацию легко объяснить — идея, возможно, хороша.
Пространства имён — отличная штука! Будем делать их больше!

Все эти основополагающие принципы полезны для понимания языка и правильного его использования. Но как они появились?

Зарождение философии Python

Идея сформулировать единый документ, который заключил бы в себе фундаментальную философию Python, возникла у разработчиков языка в 1999 году. В то время все больше и больше программистов переходили на Python с других языков программирования, внося свои предвзятые представления о разработке программного обеспечения, которые не всегда согласовывались с идейной природой Python. Тогда Тим Питерс, известный инженер-программист и один из разработчиков ядра основного интерпретатора Python, сформулировал философию языка в виде 19-ти принципов, которые были написаны в стихотворной форме в виде шуточных афоризмов. Юмористический подход подчеркивал то, что автор не хотел, чтобы эти принципы воспринимались пользователями Python слишком серьезно. Так появился Дзен Python.

Со временем афоризмы Дзена стали очень популярны среди разработчиков Python и оказали большое влияние на процесс развития языка. Они были включены в официальные предложения по улучшению Python (PEPs) в виде документа PEP 20.

Реализация Дзена

С созданием Дзена Python в виде модуля this связана одна очень интересная история.

В 2001 году компания Foretec организовывала ежегодную международную конференцию Python №10 (IPC 10). В то время Foretec была компанией по организации конференций и хотела иметь слоган, который можно было бы напечатать на футболке. Для этого был устроен конкурс среди сообщества Python.

Было получено большое количество вариантов, большинство из которых Тим Питерс считал ужасными. Тем не менее он смог выделить из них наиболее интересные, после чего вместе c Барри Варсо, одним из разработчиков языка Python, принялся выбирать победителя. Они разделили список слоганов на две части и обменивались ими друг с другом, каждый раз убирая из своего списка половину, пока не осталось всего два из них:

  1. "Bite off all you like — Chewing is optional" (переводится как "Откусывайте сколько хотите — жевать необязательно")

  2. "import this" (импортируйте это)

После того, как они выбрали "import this", Барри Варсо подумал, что было бы неплохо это реализовать. В ближайшее время должен был выйти Python 2.2, поэтому он предложил отключить уведомления о регистрации модулей и добавить модуль this, при импорте которого печатался бы Дзен Python.

После того, как конференция IPC 10 завершилась, Гвидо, Тим и Барри с релизом Python 2.2.1 выпустили этот модуль, никому об этом не сказав. Помимо этого они не просто поместили в модуль текст Дзена, но и решили слегка изменить его для легкого запутывания, зашифровав принципы с помощью шифра ROT-13.

Реализация модуля this имеет вид:

s = """Gur Mra bs Clguba, ol Gvz Crgref

Ornhgvshy vf orggre guna htyl.
Rkcyvpvg vf orggre guna vzcyvpvg.
Fvzcyr vf orggre guna pbzcyrk.
Pbzcyrk vf orggre guna pbzcyvpngrq.
Syng vf orggre guna arfgrq.
Fcnefr vf orggre guna qrafr.
Ernqnovyvgl pbhagf.
Fcrpvny pnfrf nera'g fcrpvny rabhtu gb oernx gur ehyrf.
Nygubhtu cenpgvpnyvgl orngf chevgl.
Reebef fubhyq arire cnff fvyragyl.
Hayrff rkcyvpvgyl fvyraprq.
Va gur snpr bs nzovthvgl, ershfr gur grzcgngvba gb thrff.
Gurer fubhyq or bar-- naq cersrenoyl bayl bar --boivbhf jnl gb qb vg.
Nygubhtu gung jnl znl abg or boivbhf ng svefg hayrff lbh'er Qhgpu.
Abj vf orggre guna arire.
Nygubhtu arire vf bsgra orggre guna *evtug* abj.
Vs gur vzcyrzragngvba vf uneq gb rkcynva, vg'f n onq vqrn.
Vs gur vzcyrzragngvba vf rnfl gb rkcynva, vg znl or n tbbq vqrn.
Anzrfcnprf ner bar ubaxvat terng vqrn -- yrg'f qb zber bs gubfr!"""

d = {}
for c in (65, 97):
    for i in range(26):
        d[chr(i+c)] = chr((i+13) % 26 + c)

print("".join([d.get(c, c) for c in s]))

Исходный код модуля this доступен по ссылке.

Модуль this стал одной из множества пасхалок Python, на обнаружение которой было потрачено достаточно много времени.

Если посмотреть на исходный код этого модуля, можно увидеть, что он сам нарушает многие принципы Дзена. Код не выглядит красивым и читабельным, что затрудняет объяснение его реализации. Кроме этого, однобуквенные имена переменных являются непонятными, а их объявление в глобальной области видимости попросту игнорирует пространства имен. Также есть более простой способ декодировать текст, например, с помощью встроенного модуля codecs (print(codecs.decode(s, 'rot_13'))) вместо ручной реализации с вложенными циклами, которые к тому же не являются плоскими.

Пасхалки Дзена

С Дзеном Python связано еще несколько пасхалок.

Пасхалка 1. Изначально Тим Питерс задумывал 20 афоризмов, последний из которых оставил пустым, предложив написать его Гвидо ван Россуму. Создатель Python предпочел не добавлять 20-ый принцип, и по сей день он остается пустым.

Пасхалка 2. Некоторые из принципов Дзена сами по себе являются пасхалками. Например, один из принципов звучит так:

There should be one-- and preferably only one --obvious way to do it. (Должен существовать один и, желательно, только один очевидный способ сделать это.)

Обратите внимание на то, как в оригинале записаны дефисы. Первый из них отделяется пробелом только с правой стороны, а второй — только с левой. Однажды Тиму Питерсу указали на эту грамматическую ошибку, но он сказал, что это сделано намеренно и никогда не будет изменено.

Дело в том, что существует два способа написания дефиса — с пробелами или без них. Тим решил выбрать третий вариант — по одному пробелу с одной и с другой стороны, обозначив это как шутку принципа, в котором говорится, что должен существовать только один очевидный способ сделать что-то.

Стоит отметить, что этот принцип является насмешкой над программистами Perl, главным девизом которых является "There is more than one way to do it" (Существует более одного способа сделать это), который часто сокращают до TIMTOWTDI по первым буквам каждого слова и произносят как Tim Toady. В 1990-х и начале 2000-х языки Perl и Python были жесткими конкурентами, поэтому в их сообществах существовало дружеское соперничество.

Пасхалка 3. Еще один принцип Дзена Python, который вытекает из рассмотренного выше и следует прямо за ним, тоже является пасхалкой:

Although that way may not be obvious at first unless you're Dutch. (Хотя он поначалу может быть и не очевиден, если вы не голландец.)

Это отсылка к автору языка Гвидо ван Россуму, поскольку он родом из Нидерландов. Гвидо известен как "доброжелательный пожизненный диктатор" Python, который пользуется большим уважением и имеет огромное влияние на язык и его эволюцию. Хоть в 2018 году он и ушел с этой должности, однако все равно остается ключевой фигурой в сообществе Python.

Заключение

Дзен Python подчеркивает важность простоты, ясности, удобочитаемости и согласованности кода. Эти принципы описывают общие правила проектирования программ на языке Python и философию дизайна языка.

Кстати, авторы Python всегда отличались отличным чувством юмора и любят позабавиться, поэтому спрятали пасхалки не только в Дзене, но и много где еще. Например, одной из них является команда import antigravity, при запуске которой вас перенаправит на сайт с небольшими рисованными скетчами на тему Python.

Присоединяйтесь к нашему телеграм-каналу, будет интересно и познавательно!

❤️ Happy Pythoning! ?

Комментарии (4)


  1. AkiraPiPu
    23.07.2024 09:59
    +1

    А есть что-то подобное про C ?


    1. tguev Автор
      23.07.2024 09:59
      +2

      Нашел вот такое для C++

      Philosophy rules summary:

      P.1: Express ideas directly in code
      P.2: Write in ISO Standard C++
      P.3: Express intent
      P.4: Ideally, a program should be statically type safe
      P.5: Prefer compile-time checking to run-time checking
      P.6: What cannot be checked at compile time should be checkable at run time
      P.7: Catch run-time errors early
      P.8: Don't leak any resources
      P.9: Don't waste time or space
      P.10: Prefer immutable data to mutable data
      P.11: Encapsulate messy constructs, rather than spreading through the code
      P.12: Use supporting tools as appropriate
      P.13: Use support libraries as appropriate

      Источник тут.


  1. molnij
    23.07.2024 09:59

    d = {}

    for c in (65, 97):

    for i in range(26):

    d[chr(i+c)] = chr((i+13) % 26 + c)

    Словарь? о_О

    Да, кстати, спасибо за ваш курс )