Каков исходный код модуля "this"?

Если вы откроете интерпретатор Python и введите "import this", как вы знаете, он печатает:

Дзен Питона, Тим Петерс

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

В источнике python (Lib/this.py) этот текст генерируется любопытным фрагментом кода:

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

Ответ 1

Это называется rot13:

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

Создает таблицу переводов, как в верхнем регистре (для чего это 65), так и в нижнем регистре (это то, что 97 для).

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

Распечатывает переведенную строку.

Ответ 2

Если вы хотите сделать замену ROT13 вручную - или в голове - вы можете проверить это, потому что 13 * 2 = 26 (количество букв английского алфавита), это существенно обмен:

a <-> n
b <-> o
c <-> p
...
m <-> z

A <-> N
B <-> O
C <-> P
...
M <-> Z 

Vs lbh cenpgvfr ybat rabhtu, lbh'yy riraghnyyl znfgre gur Mra bs EBG-13 nytbevguz naq ernq guvf Xyvatba ybbxvat grkgf jvgubhg pbzchgre uryc.

Ответ 3

Это шифр замещения, rot13.

Ответ 5

Я думаю, что путь лучше:

import this
print(this.s.decode('rot13'))

И что все...

Ответ 6

table="".maketrans("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ","nopqrstuvwxyzabcdefghijklmNOPQRSTUVWXYZABCDEFGHIJKLM")

this.s.translate(table)

"Zen of Python, by Tim Peters\n\nBeautiful лучше, чем уродливый.\NЭкплицитный лучше, чем неявный.\NПростой лучше, чем сложный.\NКомплекс лучше, чем сложный. \NFlat лучше вложенных. \NSparse лучше чем плотные.\nЧтобы считать.\nСпециальные случаи не являются достаточно сложными, чтобы нарушать правила.\nПри практичности бьется чистота.\nОбращения никогда не должны проходить молча.\nНекоторые явно отключены.\nВ стороне неоднозначности откажитесь от соблазна угадать. \nThere должен быть one-- и предпочтительно только один способ --obvious для этого.\nПри этом не может быть очевидным сначала, если вы не голландский. \nNow лучше, чем никогда. \n Хотя никогда не бывает лучше, чем прямо сейчас.\nЕсли реализация трудно объяснить, это плохая идея.\nЕсли реализация легко объяснить, это может быть хорошей идеей.\nИмя пространства - одна хорошая идея - позвольте сделать больше! "