「this」モジュールのソースコードは何をしていますか?


191

Pythonインタープリターを開いて「これをインポート」と入力すると、ご存じのように次のように出力されます。

禅のPython、ティム・ピーターズ

醜いよりも美しい方がいいです。
明示的は暗黙的よりも優れています。
シンプルは複雑よりも優れています。
複雑は複雑よりも優れています。
ネストよりもフラットの方が適しています。
疎は密よりも優れています。
読みやすさが重要です。
特別なケースは、ルールを破るほど特別なものではありません。
実用性は純粋さを上回りますが。
エラーがサイレントに渡ることはありません。
明示的に沈黙させない限り。
あいまいな状況に直面して、推測する誘惑を拒否してください。
それを行うには、明白な方法が1つ(できれば1つだけ)あるはずです。
あなたがオランダ人でない限り、その方法は最初は明白ではないかもしれませんが。
今は決してないよりはましです。
多くの場合、今。
実装の説明が難しい場合は、悪い考えです。
実装が説明しやすい場合は、良いアイデアかもしれません。
名前空間は非常に魅力的なアイデアの1つです。もっと多くのことをしましょう。

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

回答:


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

12
または単に'Gur Mra bs Clguba, ol Gvz Crgref'.decode('rot13')
Alex Brasetvik

3
たぶん、ROT13が昔のUsenetの時代に使用されていた主な「暗号化」方式であったことを追加する必要があります8 ^)
Zane

53
@OllieFord:冗談として。ソースコードを難読化することから、stdlibに組み込まれていてもrot13を最初から実装することまで、モジュールが行うすべてのことは、Zen of Pythonに直接違反しています。ティムピーターズもいくつかの微妙なジョークをZen自体に忍び込ませています(TOOWTDI行のダッシュが2つの異なる方法で実行されていることに注意してください)。
abarnert 2014

7
@abarnert this他の言語(Javaなど)はthisPythonと同じように使用するため、モジュールの名前も冗談の一部だと思いますself。タイピングimport thisはタイピングと同じように無意味に見えますimport java.self;
Luc

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

これは、2011年5月2日のncoghlanコメントを使用して通知されましたimport codecs。コーデックのインポートが引き続き必要かどうか、またはdecodePythonの特定のリリースで可用性が自動化されたかどうかはわかりません。decode使用しているのドキュメントにリンクできますか?
・クール

1
@Cœurこれは、IDLEのPython 3.7でも動作しません。多分これはPython 2でしたか?
フィリップ

@FilipŠああ、そうです、Python 2では機能しますが、Python 3では機能しません。しかし、Python 2では、それを実行するだけでimport this、追加のコードなしで直接印刷できます。
・クール

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.