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 目前拒绝包装返回指针或非常量引用的 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 传递给它们的参数,而无需将其转换为其他表示形式。当前,当已知预期的 Python 类型时,Boost.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 支持
- 可以使用“docstrings”记录 Python 中的模块、类型和函数,这允许在运行时自动提取文档(甚至是测试代码)。目标:完全支持 C++ 扩展模块和类的元素上的 docstrings。
- C++ long long 支持
- long long 类型是 C++ 的一个流行扩展,它允许表示至少 64 位的整数数值。
目标:自动将 C++ long long 值与 Python 相互转换。
- 代码占用空间减少
- 目前,Boost.Python 未针对减少 C++ 扩展模块的代码大小进行优化。
目标:重新设计 Boost.Python,使每个扩展模块的代码占用空间尽可能小。
- 数据内存占用空间减少
- 未在 Python 中子类化的包装 C++ 类使用的动态分配比必要的要多,从而增加了使用 Boost.Python 扩展类的应用程序的总体数据占用空间。
目标:将 C++ 类直接嵌入到 Python 对象中。这将消除由于动态分配造成的开销。