“ this”模块的源代码是做什么的?


191

如您所知,如果您打开Python解释器并输入“ import this”,它将输出:

提姆·彼得斯(Tim Peters)撰写的《 Python之禅》

美丽胜于丑陋。
显式胜于隐式。
简单胜于复杂。
复杂胜于复杂。
扁平比嵌套更好。
稀疏胜于密集。
可读性很重要。
特殊情况还不足以打破规则。
尽管实用性胜过纯度。
错误绝不能默默传递。
除非明确地保持沉默。
面对模棱两可的想法,拒绝猜测的诱惑。
应该有一种-最好只有一种-显而易见的方法。
尽管除非您是荷兰人,否则一开始这种方式可能并不明显。
现在总比没有好。
虽然从来没有比这更好正确的现在。
如果实现难以解释,那是个坏主意。
如果实现易于解释,则可能是个好主意。
命名空间是一个很棒的主意-让我们做更多这些吧!

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

Answers:


183

这称为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,2011年

12
或者只是'Gur Mra bs Clguba, ol Gvz Crgref'.decode('rot13')
Alex Brasetvik

3
也许我们应该补充一点,ROT13是旧usenet时代8 ^中使用的主要“加密”方法
Zane 2014年

53
@OllieFord:开个玩笑。该模块所做的一切,从混淆源代码到从头实现rot13(即使它已内置在stdlib中),都直接违反了Python的Zen。蒂姆·彼得斯(Tim Peters)还对禅宗本身开了些微妙的笑话(请注意,TOOWTDI线上的破折号有两种不同的用法吗?)。
abarnert 2014年

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 

与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在11年5月2日使用的评论中注意到了这一点import codecs。我不知道是否仍需要导入编解码器,或者是否decode通过某些特定版本的Python自动实现了可用性。您可以链接到decode所使用的文档吗?
心教堂

1
@Cœur这对我在IDLE的Python 3.7中也不起作用。也许这是Python 2?
FilipŠ19年

@FilipŠ哦,是的,它适用于Python 2,但不适用于Python3。但是在Python 2中,您可以执行此操作import this,它将直接打印它而无需任何其他代码。
心教堂

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.