Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Expand wrap_pyfunction!() to a closure to improve deduction. #1597

Merged
merged 2 commits into from
May 6, 2021

Commits on May 6, 2021

  1. Expand wrap_pyfunction!() to a closure.

    The change to wrap_pyfunction!() in PyO3#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.
    m-ou-se committed May 6, 2021
    Configuration menu
    Copy the full SHA
    5289ce0 View commit details
    Browse the repository at this point in the history
  2. Configuration menu
    Copy the full SHA
    d33c501 View commit details
    Browse the repository at this point in the history