#pyo3 #stub #file #generator #python #docs #pyi

pyo3-stub-gen-derive

PyO3的Stub文件 (*.pyi) 生成器

11个版本 (5个重大变更)

新版本 0.6.0 2024年8月22日
0.5.3 2024年8月21日
0.4.0 2024年8月13日
0.3.0 2024年8月9日
0.1.2 2024年8月7日

43#stub 中排名 43

Download history 314/week @ 2024-08-01 443/week @ 2024-08-08 909/week @ 2024-08-15

每月下载量 1,666
6 个crate中使用 (通过 pyo3-stub-gen)

MIT/Apache

49KB
1K SLoC

pyo3-stub-gen

PyO3的Python stub文件 (*.pyi) 生成器,用于具有 PyO3maturin 项目的项目。

crate名称 crates.io docs.rs 文档(主要部分)
pyo3-stub-gen crate docs.rs doc (main)
pyo3-stub-gen-derive crate docs.rs doc (main)

设计

我们的目标是创建一个从Rust代码生成的stub文件 *.pyi,然而,由于Rust和Python类型系统之间的差异以及proc-macro的限制,自动完整翻译是不可能的。我们采取半自动方法

  • 提供一个默认的翻译器,它将适用于 大多数 情况,但不是 所有 情况
  • 还提供了一种手动指定翻译的方法。

如果默认翻译器不起作用,用户可以手动指定翻译,这些手动翻译可以与默认翻译器生成的结果集成。因此,用户可以尽可能多地使用默认翻译器,仅针对边缘情况指定翻译。

pyo3-stub-gen crate提供了手动指定翻译的方法,而 pyo3-stub-gen-derive crate提供了基于 pyo3-stub-gen 机制的默认翻译器作为proc-macro。

用法

如果您正在寻找一个工作示例,请参阅 示例目录

示例 描述
examples/pure 纯Rust maturin项目 的示例
examples/mixed 混合 Rust/Python maturin 项目的示例
examples/mixed_sub 带有子模块的 混合 Rust/Python maturin 项目 示例

以下是基于 pyo3-stub-gen crate 的基本使用说明,该 crate 基于 examples/pure 示例。

使用 proc-macro 注释 Rust 代码

此 crate 提供了一个过程宏 #[gen_stub_pyfunction] 以及其他宏来生成 Python stub 文件。它与 PyO3 的 #[pyfunction] 宏一起使用。让我们考虑一个简单的 PyO3 项目

use pyo3::prelude::*;

#[pyfunction]
fn sum_as_string(a: usize, b: usize) -> PyResult<String> {
    Ok((a + b).to_string())
}

#[pymodule]
fn your_module_name(m: &Bound<PyModule>) -> PyResult<()> {
    m.add_function(wrap_pyfunction!(sum_as_string, m)?)?;
    Ok(())
}

要为该项目生成 stub 文件,请按照以下方式修改

use pyo3::prelude::*;
use pyo3_stub_gen::{derive::gen_stub_pyfunction, define_stub_info_gatherer};

#[gen_stub_pyfunction]  // Proc-macro attribute to register a function to stub file generator.
#[pyfunction]
fn sum_as_string(a: usize, b: usize) -> PyResult<String> {
    Ok((a + b).to_string())
}

#[pymodule]
fn your_module_name(m: &Bound<PyModule>) -> PyResult<()> {
    m.add_function(wrap_pyfunction!(sum_as_string, m)?)?;
    Ok(())
}

// Define a function to gather stub information.
define_stub_info_gatherer!(stub_info);

生成 stub 文件

然后,在 src/bin/stub_gen.rs 中创建一个可执行目标,以生成 stub 文件

use pyo3_stub_gen::Result;

fn main() -> Result<()> {
    // `stub_info` is a function defined by `define_stub_info_gatherer!` macro.
    let stub = pure::stub_info()?;
    stub.generate()?;
    Ok(())
}

并在 [lib] 部分的 Cargo.toml 中添加 rlib(除了 cdylib

[lib]
crate-type = ["cdylib", "rlib"]

当执行时,此目标生成一个 stub 文件 pure.pyi

cargo run --bin stub_gen

stub 文件会自动被 maturin 找到,并包含在 wheel 包中。有关更多详细信息,请参阅 maturin 文档

贡献

待定。

许可证

© 2024 Jij Inc。

本项目受以下其中之一许可

任选其一。

链接

依赖关系

~250–690KB
~17K SLoC