【问题标题】:Are PyArg_ParseTuple() "s" format specifiers useful in Python 3.x C API?PyArg_ParseTuple() "s" 格式说明符在 Python 3.x C API 中有用吗?
【发布时间】: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


    【解决方案1】:

    我同意你的看法——这是 Python 3 的 C API 迁移显然没有像 Python 编码器可见部分那样精心设计的几个地方之一。我也同意,目前最好的解决方法可能是关注“缓冲区视图”,根据那个宏——直到并且除非更好的东西被设计到未来的 Python C API 中(不要屏住呼吸等待这种情况发生,虽然;-)。

    【讨论】:

      猜你喜欢
      • 2011-12-28
      • 2013-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-03
      • 2010-11-03
      相关资源
      最近更新 更多