Expand wrap_pyfunction!() to a closure.
The change to wrap_pyfunction!() in #1143 makes it impossible to implement `context.add_wrapped(wrap_pyfunction!(something))` in `inline-python`. `context` does not carry the GIL lifetime, which causes type deduction trouble now that `wrap_pyfunction` results in a generic function. ``` error[E0308]: mismatched types --> examples/rust-fn.rs:12:4 | 12 | c.add_wrapped(wrap_pyfunction!(rust_print)); | ^^^^^^^^^^^ one type is more general than the other | = note: expected enum `Result<&pyo3::types::PyCFunction, _>` found enum `Result<&pyo3::types::PyCFunction, _>` ``` By re-wrapping the function as a closure, we trigger 'closure signature deduction' when passing `wrap_pyfunction!()` as an argument to a function: Rustc will deduce the signature of the closure from the function that closure is passed to. This way, the generic arguments can be deduced in more contexts, fixing the problem.
This commit is contained in:
parent
dfee3474f8
commit
5289ce0eda
|
@ -221,7 +221,7 @@ pub mod proc_macro {
|
|||
#[macro_export]
|
||||
macro_rules! wrap_pyfunction {
|
||||
($function_name: ident) => {{
|
||||
&pyo3::paste::expr! { [<__pyo3_get_function_ $function_name>] }
|
||||
&|py| pyo3::paste::expr! { [<__pyo3_get_function_ $function_name>] }(py)
|
||||
}};
|
||||
|
||||
($function_name: ident, $arg: expr) => {
|
||||
|
|
Loading…
Reference in New Issue