有沒有辦法在沒有序列化負擔的情況下使用 PyO3 暴露外部巢狀 Rust 類型

https://users.rust-lang.org/t/is-there-way-to-expose-external-nested-rust-types-with-pyo3-without-serialization-overhead/112267#post_1

有沒有辦法在 PyO3 中暴露外部的巢狀 Rust 類型,而不會有序列化的額外開銷?

我一直在嘗試重組特定工具包的 Python gRPC 客戶端,使用 Rust 的 tonic 來生成 idl,然後透過 PyO3 公開 Python 綁定。但作為完全的 Rust 初學者,我正在尋求指導,並十分感激任何經驗見解。

當前通過位元組轉換進行 Rust 和 Python 之間的通訊方式令我不滿,因為這會增加維護成本,序列化也產生了不必要的 CPU 開銷。我希望最終能夠移除 Python 的 protobuf 以及 gRPC。

我目前卡在如何讓 idl 生成的 Rust 代碼可以直接使用 PyO3 在 Python 環境中進行綁定。

我對 Rust 的基本理解是孤兒規則規定我們只能在本地板條形成或本地結構中實現本地特點。這意味著我們無法為其他板條中定義的類型實現其他板條中的特點。可能的解決方案包括:

1. 將本地結構定義為包裹類型,以包含來自外部板條的現有結構,這些結構來自我的代碼生成的 Rust IDL。
2. 在生成 IDL 的同時導入 PyO3 板條,並在 PyO3 中的每個類型(可能是巢狀的、列舉的或使用另一個外部知名 prost_types)中添加#[pyclass]宏。

潛在問題包括生成大量手寫的啟動代碼,例如轉換的實作,或處理其他板條的枚舉和 prost 類型。此外,我需要確保 Python 環境中可以存取每個巢狀成員欄位。

作為 Rust 新手,我不確定是否有更好的方法。對任何建議或見解都將不勝感激。

via The Rust Programming Language Forum – Latest posts

May 31, 2024 at 09:50PM

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *