【发布时间】:2011-01-26 05:25:25
【问题描述】:
我正在尝试编写一个处理字节字符串的 Python C 扩展,并且我有一些基本上适用于 Python 2.x 和 Python 3.x 的东西。
对于 Python 2.x 代码,在我的函数开头附近,我目前有一行:
if (!PyArg_ParseTuple(args, "s#:in_bytes", &src_ptr, &src_len))
...
我注意到s# 格式说明符同时接受Unicode 字符串和字节字符串。我真的只是希望它接受字节字符串并拒绝 Unicode。对于 Python 2.x,这可能“足够好”——标准的 hashlib 似乎也这样做,接受 Unicode 以及字节字符串。但是,Python 3.x 旨在清理 Unicode/字节字符串的混乱,而不是让两者互换。
所以,我很惊讶地发现 in Python 3.x, the s format specifiers for PyArg_ParseTuple() 似乎仍然接受 Unicode 并提供 Unicode 的“默认编码字符串版本”。这似乎违背了 Python 3.x 的原则,使得 s 格式说明符在实践中无法使用。我的分析是正确的,还是我遗漏了什么?
查看 Python 3.x 的 hashlib 的实现(例如,参见 md5module.c、函数 MD5_update() 及其对 GET_BUFFER_VIEW_OR_ERROUT() 宏的使用)我发现它避免了 s 格式说明符,而只是接受一个通用对象(O 说明符),然后使用GET_BUFFER_VIEW_OR_ERROUT() 宏进行各种显式类型检查。这是我们必须做的吗?
【问题讨论】:
标签: python python-3.x