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 物件中。這將消除由於動態分配造成的開銷。