为什么 python-3.x 删除了 ROT-13 作为编码?
Why did python-3.x remove ROT-13 as an encoding?
使用 python-2.7,您可以使用
轻松实现 rot-13 Ceasar 密码
>>> '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 isn't really an encoding",我不知道。
如果有人可以阐明这一点,我很乐意听听!
快速搜索 "what's new in python rot-13" 结果如下:https://docs.python.org/3/whatsnew/3.4.html#codec-handling-improvements
In Python 3.4, the interpreter is able to identify the known non-text
encodings provided in the standard library and direct users towards
these general purpose convenience functions when appropriate:
>>>
>>> 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 所说,很可能是清理并尝试对相似的函数进行分组。
您还可以查看此 page,其中有人将您的问题标记为错误。
对于那些不想浏览该站点及其后续链接的人,python 提交者的简单回复如下:
"Since rot_13 is a transcoder, not an encoder, the error message is correct, as is the fix for the function. However, since neither the module encodings.rot_13 nor the rot13 function in the module are documented, (not even in 2.7), I wonder if the function and the if __name__; clause are ancient holdovers that should be removed."
使用 python-2.7,您可以使用
轻松实现 rot-13 Ceasar 密码>>> '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 isn't really an encoding",我不知道。
如果有人可以阐明这一点,我很乐意听听!
快速搜索 "what's new in python rot-13" 结果如下:https://docs.python.org/3/whatsnew/3.4.html#codec-handling-improvements
In Python 3.4, the interpreter is able to identify the known non-text encodings provided in the standard library and direct users towards these general purpose convenience functions when appropriate:
>>> >>> 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 所说,很可能是清理并尝试对相似的函数进行分组。
您还可以查看此 page,其中有人将您的问题标记为错误。 对于那些不想浏览该站点及其后续链接的人,python 提交者的简单回复如下:
"Since rot_13 is a transcoder, not an encoder, the error message is correct, as is the fix for the function. However, since neither the module encodings.rot_13 nor the rot13 function in the module are documented, (not even in 2.7), I wonder if the function and the if __name__; clause are ancient holdovers that should be removed."