当我们编写 vanilla rust 并且必须将异步函数作为参数传递给另一个函数时,我们执行以下操作:
pub f<F,'a>(
test: &dyn Fn(&'a mut String, String, String, TcpStream) -> F,
) where
F: Future<Output = ()> + 'a,
但是,当我#![pyfunction]
对获得异步python函数做同样的事情时,我得到了一个错误。
e.g async def fn():
....
在阅读 PyO3 的文档时,我发现我可以将其包含PyAny
为参数。
但是,在实现以下功能时:
pub fn start_server(test: PyAny) {
test.call0();
}
我收到以下错误。
[rustc E0277] [E] the trait bound `pyo3::PyAny: pyo3::FromPyObject<'_>` is not satisfied
expected an implementor of trait `pyo3::FromPyObject<'_>`
note: required because of the requirements on the impl of `pyo3::FromPyObject<'_>` for `pyo3::PyAny`
如何在我的代码中实现这一点。如果这是不可能的,我会理解,如果是这种情况,我会要求您向我推荐一个替代方案。
更新:
我找到了另一种方法,我创建一个空结构并以下列方式调用该方法。但如果我能在不创建空结构的情况下通过,我将不胜感激。
#[pymethods]
impl Server {
#[new]
fn new() -> Self {
Self {}
}
fn start(mut self_: PyRefMut<Self>, test: &PyAny) {
test.call0();
}
}
但是在将异步函数作为参数传递时会出现错误
RuntimeWarning: coroutine
s.start(h)
RuntimeWarning: Enable tracemalloc to get the object allocation traceback