Python/C++ 集成开发的 SIG
Python/C++ 集成开发的 SIG
Python C++ SIG 是一个讨论 Python 和 C++ 集成的论坛,重点是 Boost.Python 库的开发。在撰写本文时(2002 年 1 月),Boost.Python 正在进行重大重写,以添加强大的新功能并充分利用 Python 2.2 中引入的新类型系统。关于开发方向的建议和源代码形式的贡献应发布到此 SIG。关于 Boost.Python
Boost.Python 是一个流行的开源工具,用于连接 Python 和 C++。Boost.Python 基于可访问、维护良好、文档齐全的组件(Boost C++ 库构建),因此它不会将其用户绑定到任何一个程序员或组织的服务。全球的开发人员为该项目贡献了重要的非请求改进。该库的主要开发者和协调员是 David Abrahams。开发目标
以下部分描述了当前的开发目标。关于开发方向的建议和源代码形式的贡献应发布到 Python C++ SIG。- 引用/指针支持
- Boost.Python 目前拒绝封装返回指针或非 const 引用的 C++ 函数,以防止悬空指针和引用导致 Python 端崩溃。这限制了库导出任意 C++ 函数的能力。
目标:实现一种机制,通过该机制可以安全地返回函数和方法参数内部元素的引用和指针。这将包括一种机制,通过该机制,任何参数对象都可以在任何其他参数对象的生命周期内保持活动状态,以便封装的 C++ 对象可以相互采用而无需直接使用智能指针。
- 全局注册类型强制转换
- 目标:提供一种机制,用于全局注册任意 Python 和 C++ 类型之间的类型关系,以便,例如,当 Python 元组作为 std::vector 参数传递给封装函数时,可以自动将其转换为 C++ std::vector。
- 完整跨模块支持
- Boost.Python 目前不支持跨 Python 扩展模块的继承层次结构。预计还会出现其他模块间交互问题,例如异常处理。
目标:完全支持驻留在不同扩展模块中的封装类型和函数之间的交互。
- 改进的重载支持
- Boost.Python 对重载函数和运算符的支持基于在签名与相应函数不匹配时抛出 C++ 异常。这有几个缺点:首先,在许多实现中,C++ 异常处理机制针对不抛出异常的情况进行了高度优化,抛出异常可能会导致严重的性能损失。其次,有足够的 C++ 实现的异常处理机制存在错误,因此最好不要依赖异常进行常规控制流。
目标:修改类型转换机制,以便无需使用 C++ 异常即可实现重载。
- C++ 到 Python 异常转换
- 对于任何成熟的 C++ 软件包来说,能够通过任意异常类型报告错误条件至关重要。Boost.Python 目前仅支持将有限选择的异常类型转换为 Python。
目标:实现一项功能,允许注册和自动转换任意新的异常类型。
- 默认参数支持
- 具有默认参数值的 C++ 函数目前可以暴露给 Python,但默认值会丢失。
目标:实现编译时常量默认参数表达式。可能实现用于描述默认参数的 lambda 表达式。
- 关键字参数支持
- Python 支持通过名称而不是位置指定特定函数参数。
目标:实现一项功能,允许从 Python 对封装的 C++ 函数使用关键字参数。
- 通用 C++ 到 Python 对象接口
- C++ 函数通常需要直接操作从 Python 传递给它们的D对象,而无需将它们转换为其他表示形式。目前 Boost.Python 在已知预期 Python 类型的情况下,对这种用法有未文档化的支持。
目标:添加一种 C++ 类型,它封装任何 Python 对象并提供类似于 Python 的接口,并在运行时检查任何操作的有效性。
- 将标准 C++ 算法应用于 Python 对象的接口
- 目标:实现将 C++ 标准模板库算法和 Boost 算法应用于 Python 对象(例如 Python 列表、元组、字符串和支持缓冲区接口的 Python 对象)的接口。
- Python LONG 支持
- Python 提供了一种任意精度 LONG 整型,Boost.Python 目前不支持。
目标:添加一个与 Python LONG 交互的接口,允许在 C++ 中以自然的方式直接操作它们。
- 改进的内置数字类型强制转换
- 目标:Python 至少提供 4 种数字类型,其中任何一种都应该能够在预期任何 C++ 数字类型参数的地方传递,前提是转换不会丢失重要信息。
- Python 迭代器支持
- 目标:Python 2.2 提供了一个迭代接口,应该允许 C++ 序列以自然的方式轻松暴露给 Python。
- C++ 对象自动初始化
- 虽然 Python 允许在没有初始化的情况下创建类,但 C++ 不允许。Boost.Python 目前允许 Python 扩展类的 C++ 基类保持未初始化状态。这种行为并不总是合适的。
目标:可选支持 C++ 基类的自动默认构造以及在基类未初始化时报告错误。
- DocString 支持
- Python 中的模块、类型和函数可以通过“文档字符串”进行文档化,这允许在运行时自动提取文档(甚至测试代码)。目标:对 C++ 扩展模块和类的元素的文档字符串提供完整支持。
- C++ long long 支持
- long long 类型是 C++ 的一个流行扩展,它允许表示至少 64 位的整数数值。
目标:C++ long long 值到/从 Python 的自动转换。
- 代码占用空间减少
- 目前 Boost.Python 未优化以减少 C++ 扩展模块的代码大小。
目标:重新设计 Boost.Python,使每个扩展模块的代码占用空间尽可能小。
- 数据内存占用空间减少
- 未在 Python 中子类化的封装 C++ 类使用的动态分配多于必要,增加了使用 Boost.Python 扩展类的应用程序的整体数据占用空间。
目标:将 C++ 类直接嵌入到 Python 对象中。这将消除动态分配带来的开销。
