使用 python-2.7,您可以使用
>>> 'abcdefghijklmnopqrstuvwxyz'.encode('rot-13')
'nopqrstuvwxyzabcdefghijklm'
你甚至可以在CPython存储库的Python代码中找到它。
但是,python3.6 上的相同代码给出了 -
>>> 'abcdefghijklmnopqrstuvwxyz'.encode('rot-13')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
LookupError: 'rot-13' is not a text encoding; use codecs.encode() to handle arbitrary codecs
如果我想在python3.x中使用rot-13
编码,我需要导入codecs
。
>>> import codecs
>>> codecs.encode('abcdefghijklmnopqrstuvwxyz', 'rot-13')
'nopqrstuvwxyzabcdefghijklm'
当然,这确实是一个小问题,我不介意导入codecs
来实现凯撒密码(无论如何它都是内置的(。我只是想知道这个设计决策背后是否有任何潜在的理由。也许原因很简单,就像"rot-13 不是真正的编码"一样简单,我不知道。
如果有人能对此有所了解,我很想听听!
您还可以查看此页面,其中有人将您的问题标记为错误。对于那些不想浏览该网站及其后续链接的人,python提交者的简单响应如下:
"由于rot_13是转码器,而不是编码器,因此错误消息是正确的,该功能的修复也是如此。但是,由于模块encodings.rot_13和模块中的 rot13 函数都没有记录(甚至在 2.7 中也没有(,我想知道函数和 if 是否__name__;条款是古老的保留,应该删除。
快速搜索"python rot-13 中的新功能"会得到这个结果: https://docs.python.org/3/whatsnew/3.4.html#codec-handling-improvements
在Python 3.4中,解释器能够识别已知的非文本。 标准库中提供的编码,并引导用户 这些通用便利功能在适当时:
>>> >>> b"abcdef".decode("hex") Traceback (most recent call last): File "<stdin>", line 1, in <module> LookupError: 'hex' is not a text encoding; use codecs.decode() to handle arbitrary codecs >>> "hello".encode("rot13") Traceback (most recent call last): File "<stdin>", line 1, in <module> LookupError: 'rot13' is not a text encoding; use codecs.encode() to handle arbitrary codecs
因此,显然,这是一个清理操作,用于将实际的文本编码(您将在open(file, encoding="foo")
调用中使用(与其他编码分开。
Python 将 rot13 移动到(如你所说(编解码器。我的猜测是为了更好地反映rot13是什么,并使用不同的、更通用的界面。正如TimPietzcker所说,很可能是清理并尝试对类似的功能进行分组。