首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Pyo3:特性‘`PyClass`’不是为`&Py<PyAny>`实现的

Pyo3:特性‘`PyClass`’不是为`&Py<PyAny>`实现的
EN

Stack Overflow用户
提问于 2021-05-18 23:07:21
回答 1查看 933关注 0票数 1

我正在学习生锈,并试图使用pyo3马图林制作一个非常简单的python模块。不过,我在生锈密码上有个问题,

Cargo.toml

代码语言:javascript
复制
[package]
name = "lenrs"
version = "0.1.0"
authors = ["matheusfillipe"]
edition = "2018"

[dependencies.pyo3]
version = "0.13.2"
features = ["extension-module"]

[lib]
crate-type = ["cdylib"]
name = "lenrs"

src/lib.rs

代码语言:javascript
复制
extern crate pyo3;

use pyo3::exceptions::PyTypeError;
use pyo3::prelude::*;
use pyo3::wrap_pyfunction;

#[pyfunction]
fn length(py: Python, obj: &PyObject) -> PyResult<PyObject> {
    if let Ok(s) = obj.extract::<String>(py) {
        return Ok(s.len().to_object(py));
    }
    if let Ok(s) = obj.extract::<Vec<String>>(py) {
        return Ok(s.len().to_object(py));
    }
    Err(PyTypeError::new_err("Not Supported"))
}

#[pymodule]
fn lenrs(py: Python, m: &PyModule) -> PyResult<()> {
    m.add_wrapped(wrap_pyfunction!(length))?;
    Ok(())
}

lenrs/init.py

代码语言:javascript
复制
from .lenrs import *

构建输出

代码语言:javascript
复制
$ cargo build                 
   Compiling lenrs v0.1.0 (/home/matheus/projects/learn-rust/lenrs)
error[E0277]: the trait bound `&Py<PyAny>: PyClass` is not satisfied
 --> src/lib.rs:7:1
  |
7 | #[pyfunction]
  | ^^^^^^^^^^^^^ the trait `PyClass` is not implemented for `&Py<PyAny>`
  |
  = note: required because of the requirements on the impl of `pyo3::FromPyObject<'_>` for `&Py<PyAny>`
  = note: required because of the requirements on the impl of `ExtractExt<'_>` for `&Py<PyAny>`
  = note: this error originates in an attribute macro (in Nightly builds, run with -Z macro-backtrace for more info)

error: aborting due to previous error

For more information about this error, try `rustc --explain E0277`.
error: could not compile `lenrs`

To learn more, run the command again with --verbose.

我看到问题出在#[pyfunction]上。当我有一个只适用于字符串的更简单的版本,并且length函数将返回PyResult<()>时,一切都进行得很好,最后我只会返回Ok(()),但是现在我不确定如果不支持该类型,如何才能得到这个函数来引发python错误。

EN

回答 1

Stack Overflow用户

发布于 2021-05-20 23:34:37

我刚刚发现obj不应该是引用,将函数签名更改为:fn length(py: Python, obj: PyObject) -> PyResult<PyObject>使其工作:

代码语言:javascript
复制
extern crate pyo3;

use pyo3::exceptions::PyTypeError;
use pyo3::prelude::*;
use pyo3::wrap_pyfunction;

#[pyfunction]
fn length(py: Python, obj: PyObject) -> PyResult<PyObject> {
    if let Ok(s) = obj.extract::<String>(py) {
        return Ok(s.len().to_object(py));
    }
    if let Ok(s) = obj.extract::<Vec<String>>(py) {
        return Ok(s.len().to_object(py));
    }
    Err(PyTypeError::new_err("Not Supported"))
}

#[pymodule]
fn lenrs(py: Python, m: &PyModule) -> PyResult<()> {
    m.add_wrapped(wrap_pyfunction!(length))?;
    Ok(())
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67595021

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档