3

使用 python-2.7,您可以使用以下方法轻松实现 rot-13 Ceasar Cipher

>>> 'abcdefghijklmnopqrstuvwxyz'.encode('rot-13')
'nopqrstuvwxyzabcdefghijklm'

您甚至可以在CPython 存储库的 Zen of 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

如果我想rot-13在 python3.x 中使用编码,我需要导入codecs.

>>> import codecs
>>> codecs.encode('abcdefghijklmnopqrstuvwxyz', 'rot-13')
'nopqrstuvwxyzabcdefghijklm'

当然,这确实是一个小问题,我不介意导入codecs以实现凯撒密码(无论如何它都是内置的)。我只是想知道这个设计决定背后是否有任何潜在的理由。也许原因就像“rot-13 不是真正的编码”一样简单,我不知道。

如果有人可以对此有所了解,我很想听听!

4

3 回答 3

5

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

“由于 rot_13 是转码器,而不是编码器,因此错误消息是正确的,该功能的修复也是如此。但是,由于模块 encodings.rot_13 和模块中的 rot13 函数都没有记录,(即使在 2.7 中也没有) ,我想知道函数和 if __name__; 子句是否是应该删除的古老保留。”

于 2018-03-23T06:34:59.943 回答
3

快速搜索“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")调用中使用)与其他编码分开。

于 2018-03-23T06:27:49.397 回答
0

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

于 2018-03-23T06:34:34.847 回答