当前位置: 首页 > news >正文

创建一个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)

执行结果

http://www.cnnetsun.cn/news/89383.html

相关文章:

  • 震撼!这家全景效果企业如何颠覆传统,让客户体验飙升!
  • JVM性能分析
  • 商家福音!用PHP对接快递鸟接口,一键搞定单号所属快递识别
  • YT29B凿岩机吕梁精准检测稳定性能解析
  • 26、网络连接与安全全解析
  • 2025.12.16 HSRP双机热备
  • 万全智能RFID模块设备他们产品档次怎么样
  • RuoYi v1.2.0 全端开发神器:让多端适配从未如此简单!
  • 少儿编程Scratch3.0教程——03 外观积木(基础知识)
  • libxslt XSLT转换库:鸿蒙PC上的XML转换工具
  • GPU算力租赁推荐:低成本训练YOLO大模型
  • VonaJS是如何做到文件级别精确HMR(热更新)的?
  • 口碑好的货架哪里有好的
  • pytorch框架训练、推理、模块冻结等各种细节说明
  • Java毕设项目推荐-基于Java语言的茶叶销售系统的前端设计与实现基于SpringBoot+Vue茶叶销售系统的设计与实现【附源码+文档,调试定制服务】
  • 大数据生态核心组件语法与原理详解
  • UVa 11617 An Odd Love
  • LobeChat能否对接Slack?团队协作平台集成方案
  • 集团宽带是什么意思?企业如何选择合适的宽带方案?
  • 运维外包的公司靠谱吗?企业真能省心?
  • HunyuanVideo-Foley:AI让视频自动配声
  • 信息安全技术与Kali Linux
  • GEO系统:多区域搜索排名监控与品牌形象统一维护解决方案
  • 17、Apache服务器的代理配置、URL重写、自定义日志及性能监控
  • 18、Apache服务器性能测试与配置全解析
  • PostgreSQL 18 远程操作实战:从连接到备份的操作实践记录
  • S33-装一个Server2016+PCS7虚拟机
  • LobeChat能否部署在腾讯云CVM?国产云服务商适配教程
  • 本地使用ComfyUI运行Stable Diffusion 3.5
  • 力扣(LeetCode) 27: 移除元素 - 解法思路