Python 2.xでカエサル暗号を一行で書く方法

驚いたので書留めておく。Pythonのencodeとはいったい…うごごご

"abcd".encode("rot13")
# => nopq

またdecryptも

"nopq".decode("rot13")

で一行で書ける。ワンライナーと呼ぶほどおしゃれなものではない。

ときにPythonカエサル暗号というと、import thisの中身Zen of Pythonの文言が暗号化されていて、それをdecryptしてから出力しているのが有名ですね。

s = """Gur Mra bs Clguba, ol Gvz Crgref
...
省略
...
"""

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

encode/decodeで暗号化できるとある意味便利? いやそもそもなんでこんなコーデックが入っているのだろう…。実用性とかあるのだろうか? PHPにもstr_rot13なるものがあるらしいけど。
3.x 系ではrot13は使えなくなっているとの由。やはりよろしくないということか。

さて、rot13を自力で実装する場合はmaketransがスマート。ぜんぜん違う処理になってるけど。
python - Short rot13 function - Stack Overflow

import string
rot13 = string.maketrans( \
    "ABCDEFGHIJKLMabcdefghijklmNOPQRSTUVWXYZnopqrstuvwxyz", \
    "NOPQRSTUVWXYZnopqrstuvwxyzABCDEFGHIJKLMabcdefghijklm")
string.translate("Hello World!", rot13)
# 'Uryyb Jbeyq!'