Apa kode sumber modul “ini” lakukan?

193

Jika Anda membuka juru bahasa Python, dan ketik "import this", seperti yang Anda tahu, itu akan mencetak:

Zen Python, oleh Tim Peters

Cantik lebih baik dari yang jelek.
Eksplisit lebih baik daripada implisit.
Sederhana lebih baik daripada kompleks.
Kompleks lebih baik daripada rumit.
Flat lebih baik daripada bersarang.
Jarang lebih baik daripada padat.
Jumlah keterbacaan diperhitungkan.
Kasus khusus tidak cukup istimewa untuk melanggar aturan.
Meskipun kepraktisan mengalahkan kemurnian.
Kesalahan tidak boleh terjadi secara diam-diam.
Kecuali secara eksplisit dibungkam.
Dalam menghadapi ambiguitas, tolak godaan untuk menebak.
Harus ada satu - dan lebih disukai hanya satu - cara yang jelas untuk melakukannya.
Meskipun demikian mungkin tidak jelas pada awalnya kecuali Anda orang Belanda.
Sekarang lebih baik daripada tidak sama sekali.
Meskipun tidak pernah sering lebih baik daripadatepat sekarang.
Jika implementasinya sulit dijelaskan, itu ide yang buruk.
Jika implementasinya mudah dijelaskan, mungkin itu ide yang bagus.
Namespaces adalah salah satu ide bagus - mari kita lakukan lebih dari itu!

Dalam sumber python (Lib / this.py) teks ini dihasilkan oleh sepotong kode yang aneh:

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

Jawaban:

184

Ini disebut pengkodean rot13 :

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

Buat tabel terjemahan, untuk karakter huruf besar (untuk apa 65) dan huruf kecil (inilah untuk 97) karakter.

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

Mencetak string yang diterjemahkan.

Eli Bendersky
sumber
27
Dan itu sebenarnya dapat diimplementasikan lebih sederhana baik dalam 2.x dan 3.x sebagai import codecs; print(codecs.decode(s, "rot-13")). Menuliskan algoritme dengan tangan seperti itu hanyalah kebingungan lebih lanjut dari telur paskah.
ncoghlan
12
Atau adil 'Gur Mra bs Clguba, ol Gvz Crgref'.decode('rot13').
Alex Brasetvik
3
Mungkin kita harus menambahkan bahwa ROT13 adalah metode "enkripsi" utama yang digunakan di masa usenet lama 8 ^)
Zane
53
@OllieFord: Sebagai lelucon. Segala sesuatu yang dikerjakan modul, dari mengaburkan kode sumber hingga mengimplementasikan rot13 dari awal meskipun sudah ada di stdlib, langsung melanggar Zen Python. Tim Peters juga menyelipkan beberapa lelucon halus ke Zen itu sendiri (perhatikan garis putus-putus pada garis TOOWTDI apakah itu dua cara yang berbeda?).
abarnert
7
@abarnert Saya pikir nama modul,, thisjuga merupakan bagian dari lelucon karena bahasa lain (misalnya Jawa) menggunakan thismirip dengan cara menggunakan Python self. Mengetik import thisterlihat tidak ada gunanya seperti mengetik import java.self;.
Luc
25

Jika Anda ingin membuat substitusi ROT13 dengan tangan - atau di kepala Anda - Anda dapat memeriksanya karena 13 * 2 = 26 (jumlah huruf alfabet bahasa Inggris), itu pada dasarnya merupakan pertukaran:

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.

ypercubeᵀᴹ
sumber
12

Ini adalah cipher substitusi, rot13 .

Michael J. Barber
sumber
11

Ini menggunakan pengkodean ROT13 . Ini digunakan karena ini lelucon.

Anda juga dapat menggunakan fungsi Python untuk mendekode string.

Hanya Python 2:

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

Python 2 & 3:

import codecs
print(codecs.decode(this.s, 'rot-13'))
trunker
sumber
Ini diperhatikan oleh komentar ncoghlan pada 2 Mei '11 menggunakan import codecs. Saya tidak tahu apakah mengimpor codec masih diperlukan atau jika ketersediaan decodedibuat otomatis dengan beberapa rilis khusus Python. Bisakah Anda menautkan ke dokumentasi decodeyang Anda gunakan?
Cœur
1
@ Cœur Ini juga tidak berfungsi untuk saya dalam Python 3.7 di IDLE. Mungkin ini Python 2?
Filip Š
@ FilipŠ oh, Anda benar, ini berfungsi dengan Python 2 tetapi tidak dengan Python 3. Tetapi dalam Python 2, Anda bisa melakukannya import thisdan akan mencetaknya langsung tanpa kode tambahan.
Cœur