注意: 雖然 JavaScript 對於本網站不是必需的,但您與內容的互動將受到限制。請開啟 JavaScript 以獲得完整的體驗。

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 物件中。這將消除動態分配帶來的開銷。