Подтвердить что ты не робот

Атрибуты модуля Python `this`

Ввод import this возвращает Zen из Python Тима Петерса. Но я заметил, что на модуле есть 4 свойства:

this.i 
this.c
this.d
this.s

Я вижу, что утверждение

print(''.join(this.d.get(el, el) for el in this.s))

использует this.d для декодирования this.s для печати Zen.

Но может ли кто-нибудь сказать мне, для чего нужны атрибуты this.i и this.c?

Я предполагаю, что они есть намеренно - ответы на этот вопрос, похоже, предполагают, что есть другие шутки, которые можно почерпнуть из формулировки Дзэн. Мне интересно, есть ли ссылка, которую я пропускаю с этими двумя значениями.

Я заметил, что значения различаются между версиями Python:

# In v3.5:
this.c
Out[2]: 97
this.i
Out[3]: 25

# In v2.6
this.c
Out[8]: '!'
this.i
Out[9]: 25
4b9b3361

Ответ 1

i и c - это просто переменные цикла, используемые для создания словаря d. Из исходный код модуля:

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

Это создает отображение ROT-13; каждая буква ASCII (кодовые страницы с 65 по 90 для прописных букв, от 97 до 122 для нижнего регистра) сопоставляется с другой буквой ASCII с 13 точками вдоль алфавита (с обратной связью до A и далее). Таким образом, A (точка 65 ASCII) отображается на N и наоборот (а также A отображается на N):

>>> c, i = 65, 0
>>> chr(i + c)
'A'
>>> chr((i + 13) % 26 + c)
'N'

Обратите внимание, что если вы хотите самостоятельно писать ROT-13, есть более простой метод; просто кодируйте или декодируйте с помощью кодека rot13:

>>> this.s
"Gur Mra bs Clguba, ol Gvz Crgref\n\nOrnhgvshy vf orggre guna htyl.\nRkcyvpvg vf orggre guna vzcyvpvg.\nFvzcyr vf orggre guna pbzcyrk.\nPbzcyrk vf orggre guna pbzcyvpngrq.\nSyng vf orggre guna arfgrq.\nFcnefr vf orggre guna qrafr.\nErnqnovyvgl pbhagf.\nFcrpvny pnfrf nera'g fcrpvny rabhtu gb oernx gur ehyrf.\nNygubhtu cenpgvpnyvgl orngf chevgl.\nReebef fubhyq arire cnff fvyragyl.\nHayrff rkcyvpvgyl fvyraprq.\nVa gur snpr bs nzovthvgl, ershfr gur grzcgngvba gb thrff.\nGurer fubhyq or bar-- naq cersrenoyl bayl bar --boivbhf jnl gb qb vg.\nNygubhtu gung jnl znl abg or boivbhf ng svefg hayrff lbh'er Qhgpu.\nAbj vf orggre guna arire.\nNygubhtu arire vf bsgra orggre guna *evtug* abj.\nVs gur vzcyrzragngvba vf uneq gb rkcynva, vg'f n onq vqrn.\nVs gur vzcyrzragngvba vf rnfl gb rkcynva, vg znl or n tbbq vqrn.\nAnzrfcnprf ner bar ubaxvat terng vqrn -- yrg'f qb zber bs gubfr!"
>>> import codecs
>>> codecs.decode(this.s, 'rot13')
"The Zen of Python, by Tim Peters\n\nBeautiful is better than ugly.\nExplicit is better than implicit.\nSimple is better than complex.\nComplex is better than complicated.\nFlat is better than nested.\nSparse is better than dense.\nReadability counts.\nSpecial cases aren't special enough to break the rules.\nAlthough practicality beats purity.\nErrors should never pass silently.\nUnless explicitly silenced.\nIn the face of ambiguity, refuse the temptation to guess.\nThere should be one-- and preferably only one --obvious way to do it.\nAlthough that way may not be obvious at first unless you're Dutch.\nNow is better than never.\nAlthough never is often better than *right* now.\nIf the implementation is hard to explain, it a bad idea.\nIf the implementation is easy to explain, it may be a good idea.\nNamespaces are one honking great idea -- let do more of those!"

Что касается разницы в Python 2.6 (или Python 2.7 в этом отношении) по сравнению с Python 3.5; одно и то же имя переменной c также используется в понимании списка в вызове str.join():

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

В Python 2, понимание списков не получает их собственной области (в отличие от выражений генератора и требований dict и set). В Python 3 они делают, а значение c в понимании списка больше не является частью пространства имен модулей. Таким образом, последнее значение, присвоенное c в области видимости модуля, равно 97 в Python 3 и this.s[-1] (так a '!') в Python 2. См. Почему список понимание записывается в переменную цикла, но генераторы не работают?

В этих 1-буквенных именах переменных нет шутки. В самом дзене есть шутки. Подобно тому, что между исходным кодом модуля this и самим текстом вы можете найти нарушения практически для всех правил!