Що робить вихідний код модуля "цей"?


193

Якщо ви відкриєте інтерпретатор 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])

Відповіді:


184

Це називається кодування 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])

Друкує перекладений рядок.


27
І це насправді можна реалізувати простіше і в 2.x і 3.x як import codecs; print(codecs.decode(s, "rot-13")). Виписання алгоритму вручну, таким чином, було лише подальшим придушенням пасхального яйця.
ncoghlan

12
Або просто 'Gur Mra bs Clguba, ol Gvz Crgref'.decode('rot13').
Олексій Брасевік

3
Можливо, слід додати, що ROT13 був основним методом "шифрування", який застосовувався в старі дні usenet 8 ^)
Зане,

53
@OllieFord: Як жарт. Все, що робить модуль - від обфускування вихідного коду до впровадження rot13 з нуля, навіть якщо він вбудований у stdlib, безпосередньо порушує дзен Python. Тім Пітерс також промацував кілька тонких жартів у сам дзен (зауважте, тире на лінії TOOWTDI це роблять двома різними способами?).
abarnert

7
@abarnert Я думаю, що назва модуля, thisтакож є частиною жарту, оскільки інші мови (наприклад, Java) використовують thisаналогічно тому, як використовує Python self. Введення тексту import thisвиглядає так само безглуздо, як і введення тексту import java.self;.
Люк

25

Якщо ви хочете зробити заміну 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.



11

Він використовує кодування ROT13 . Це використовується, тому що це жарт.

Ви також можете використовувати функції Python для декодування рядка.

Python 2 тільки:

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

Python 2 і 3:

import codecs
print(codecs.decode(this.s, 'rot-13'))

Це було помічено ncoghlan коментаря 2 травня '11 допомоги import codecs. Я не знаю, чи потрібно ще імпортувати кодеки або чи доступність decodeбула зроблена автоматично з певним випуском Python. Чи можете ви зв’язатись із документацією того, decodeщо ви використовуєте?
Cœur

1
@ Cœur Це також не працює для мене в Python 3.7 в IDLE. Можливо, це був Python 2?
Філіп Ш

@ FilipŠ о, ти маєш рацію, він працює з Python 2, але не з Python 3. Але в Python 2 ви просто можете це зробити, import thisі він буде надрукувати його безпосередньо без додаткового коду.
Cœur

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.