news 2026/6/10 14:47:09

创建一个rust写的python库[signatures和错误处理]

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
创建一个rust写的python库[signatures和错误处理]

照例先创建初始话选pyo3

maturin init

修改src/lib.rs

use pyo3::prelude::*; use pyo3::types::{PyDict, PyTuple}; use pyo3::exceptions::PyValueError; use pyo3::exceptions::PyOSError; use std::num::ParseIntError; use std::fmt; // 定义一个类 #[pyclass] struct MyClass { num: i32, } // 实现类方法 #[pymethods] impl MyClass { #[new] #[pyo3(signature = (num=-1))] fn new(num:i32) -> Self { MyClass { num } } #[pyo3(signature = (num=10,*py_args,name="Hello",**py_kwargs))] fn method( &mut self, num: i32, py_args: &Bound<'_, PyTuple>,// 接受任意个python位置参数(positional argument) name: &str, py_kwargs: Option<&Bound<'_, PyDict>>,// 接受任意个python关键字参数(keyword argument) ) -> String { let num_before = self.num; self.num = num; format!( "num={} (was previously={}), py_args={:?}, name={}, py_kwargs={:?} ", num, num_before, py_args, name, py_kwargs, ) } fn make_change(&mut self, num: i32) -> PyResult<String> { self.num = num; Ok(format!("num={}", self.num)) } } #[pyfunction] // 用new_err创建一个PyErr fn check_positive(x: i32) -> PyResult<()> { if x < 0 { Err(PyValueError::new_err("x is negative")) } else { Ok(()) } } #[pyfunction] fn parse_int(x: &str) -> Result<usize, ParseIntError> { x.parse() } #[pyfunction] fn parse_int2(x: &str) -> PyResult<usize> { let x = x.parse()?; Ok(x) } // 自定义IO错误CustomIOError // 实现标准库的Error trait // 实现Display trait // 实现From trait,定义如何将自定义CustomIOError转换成PyO3的PyErr #[derive(Debug)] struct CustomIOError; impl std::error::Error for CustomIOError {} impl fmt::Display for CustomIOError { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "Oh no!") } } impl std::convert::From<CustomIOError> for PyErr { fn from(err: CustomIOError) -> PyErr { PyOSError::new_err(err.to_string()) } } #[pyfunction] fn parse_int3(x: &str) -> Result<usize,CustomIOError> { match x.parse() { Ok(parsed) => Ok(parsed), Err(_) => Err(CustomIOError), } } /// A Python module implemented in Rust. #[pymodule] mod my_extension_sign_err { use pyo3::prelude::*; use pyo3::types::{PyDict, PyTuple}; //python的字典格 #[pymodule_export] use super::MyClass; #[pymodule_export] use super::check_positive; #[pymodule_export] use super::parse_int; #[pymodule_export] use super::parse_int2; #[pymodule_export] use super::parse_int3; #[pyfunction] #[pyo3(signature = (**kwds))]//接受任意个数参数 fn num_kwds(kwds: Option<&Bound<'_, PyDict>>) -> usize { kwds.map_or(0, |dict| dict.len()) } }

这段代码定义了一个名为my_extension_sign_err的 Python 模块,它包含一个类MyClass和多个函数(如check_positiveparse_int)。代码展示了 PyO3 的核心功能:

  • 使用#[pyclass]#[pymethods]定义 Python 类。
  • 通过#[pyfunction]导出 Python 函数。
  • 处理错误和异常,包括自定义错误转换。
  • 支持复杂的函数签名(如位置参数和关键字参数)。

先编译安装一下

maturin develop

再写个脚本测试一下

import my_extension_sign_err # 传入多个任意参数 print(my_extension_sign_err.num_kwds(a=1, b=2, c=3,d='ood')) # 使用类方法 myclass = my_extension_sign_err.MyClass() print(myclass.method(1,[2,3],'ood',a=1,b=2,c=3)) print(myclass.make_change(13)) print(myclass.method(1,[2,3],'ood',a=1,b=2,c=3)) # 使用异常处理,自定义PyErr try: res = my_extension_sign_err.check_positive(12) print(res) res = my_extension_sign_err.check_positive(-12) print(res) except Exception as e: print(e) # 使用异常处理,ParseIntError try: res = my_extension_sign_err.parse_int("11") print(res) res = my_extension_sign_err.parse_int("bar1") print(res) except Exception as e: print(e) # 使用异常处理,PyResult包装 try: res = my_extension_sign_err.parse_int2("12") print(res) res = my_extension_sign_err.parse_int2("bar2") print(res) except Exception as e: print(e) # 使用异常处理,使用自定义CustomIOError try: res = my_extension_sign_err.parse_int3("13") print(res) res = my_extension_sign_err.parse_int3("bar3") print(res) except Exception as e: print(e)

执行结果

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 2:52:59

Windows下部署EmotiVoice语音合成全指南

Windows下部署EmotiVoice语音合成全指南 在智能家居设备日益复杂的今天&#xff0c;确保无线连接的稳定性已成为一大设计挑战。而当我们将目光转向音频体验时&#xff0c;类似的“基础但关键”的问题也在浮现&#xff1a;如何让机器发出的声音不只是清晰可辨&#xff0c;而是真…

作者头像 李华
网站建设 2026/6/10 10:51:41

宣传册设计与制作指南,B端高效获客的视觉解决方案

宣传册设计与制作指南&#xff1a;B端企业高效获客的视觉解决方案小编说&#xff1a;在信息爆炸的时代&#xff0c;一份设计精良、制作考究的宣传册&#xff0c;依然是B端企业建立专业形象、传递核心价值、高效获取客户信任的“无声销售员”。然而&#xff0c;从创意构思到实物…

作者头像 李华
网站建设 2026/6/10 10:49:03

1.2 揭秘 OpenAI Function Calling 内部原理,手写第一个文件搜索工具

1.2 揭秘 OpenAI Function Calling 内部原理&#xff0c;手写第一个文件搜索工具导语&#xff1a;在上一章中&#xff0c;我们了解了 Function Calling 的基本概念和使用方法。但知其然&#xff0c;更要知其所以然。本章将深入 OpenAI Function Calling 的内部机制&#xff0c;…

作者头像 李华
网站建设 2026/6/10 13:13:03

在云函数中如何实现自定义国际时区UTC - JavaScript

在云函数中使用配置时区的方式通过代码控制 下面写两个版本&#xff1a; 版本一&#xff1a;使用服务器本地时间&#xff08;服务器时区是东八区&#xff09; 版本二&#xff1a;使用UTC时间并转换为东八区时间 获取当前日期时间格式化为 YYYY-MM-DD HH:MM:SS 格式的函数 1. 基…

作者头像 李华
网站建设 2026/6/10 10:51:42

大模型Agent强化学习完全指南:从PPO到GRPO的工具使用技术解析

文章详细介绍了大模型Agent的强化学习技术&#xff0c;特别是基于GRPO的工具使用方法。分析了多种算法&#xff08;PPO、GRPO等&#xff09;在让大模型使用code interpreter、web search等工具方面的应用&#xff0c;并介绍了TORL、ToolRL、OTC等多个研究项目。同时&#xff0c…

作者头像 李华
网站建设 2026/6/10 9:13:17

笨人小白的温故知新——递归(4)

1202&#xff1a;Pell数列 其实本来是一段很简单的代码&#xff0c;但是这个题带给我的收获很大&#xff0c;所以我决定来做一个自己的反思回顾。 来讲一下我做这道题遇到的问题&#xff08;主要是解决运行超时的问题&#xff09;&#xff1a; 1&#xff09;我一开始并没有用…

作者头像 李华