为什么python-3.x删除ROT-13作为编码?

时间:2018-03-23 06:24:47

标签: python python-3.x python-2.7 encoding rot13

使用python-2.7,您可以使用

轻松实现rot-13 Ceasar Cipher
>>> 'abcdefghijklmnopqrstuvwxyz'.encode('rot-13')
'nopqrstuvwxyzabcdefghijklm'

您甚至可以在Zen of Python code in the CPython repository中找到它。

然而,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不是真正的编码”一样简单,我不知道。

如果有人可以对此有所了解,我很乐意听到它!

3 个答案:

答案 0 :(得分:4)

您还可以查看此page,其中有人将您的问题标记为错误。 对于那些不想浏览网站及其后续链接的人来说,python提交者的简单响应如下:

&#34;由于rot_13是代码转换器,而不是编码器,因此错误消息是正确的,函数的修复也是如此。但是,由于模块中的模块编码.rot_13和rot13函数都没有记录,(甚至在2.7中都没有),我想知道函数和if __name__;条款是应该删除的古老遗留物。&#34;

答案 1 :(得分:3)

快速搜索&#34; python rot-13&#34;中的新内容出现这个: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")调用中使用)与其他编码分开。

答案 2 :(得分:0)

Python将rot13移动到(如你所说)编解码器。我的猜测是更好地反映rot13是什么,并使用不同的更通用的界面。正如TimPietzcker所说,很可能是清理并尝试将类似功能分组。