diff --git a/CHANGELOG.md b/CHANGELOG.md index 465451d8..56da0781 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -33,6 +33,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - Add `#[pyo3(text_signature = "...")]` syntax for setting text signature. [#1658](https://github.com/PyO3/pyo3/pull/1658) - Add support for setting and retrieving exception cause. [#1679](https://github.com/PyO3/pyo3/pull/1679) - Add FFI definitions from `cpython/pystate.h`.[#1687](https://github.com/PyO3/pyo3/pull/1687/) +- Add `wrap_pyfunction` macro to prelude. [#1695](https://github.com/PyO3/pyo3/pull/1695) ### Changed diff --git a/README.md b/README.md index 310201ba..232e4d2d 100644 --- a/README.md +++ b/README.md @@ -58,7 +58,6 @@ features = ["extension-module"] ```rust use pyo3::prelude::*; -use pyo3::wrap_pyfunction; /// Formats the sum of two numbers as string. #[pyfunction] diff --git a/examples/pyo3-benchmarks/src/lib.rs b/examples/pyo3-benchmarks/src/lib.rs index 47543690..e649fd1c 100644 --- a/examples/pyo3-benchmarks/src/lib.rs +++ b/examples/pyo3-benchmarks/src/lib.rs @@ -1,6 +1,5 @@ use pyo3::prelude::*; use pyo3::types::{PyDict, PyTuple}; -use pyo3::wrap_pyfunction; #[pyfunction] fn none() {} diff --git a/examples/pyo3-pytests/src/datetime.rs b/examples/pyo3-pytests/src/datetime.rs index b7231841..a3522b48 100644 --- a/examples/pyo3-pytests/src/datetime.rs +++ b/examples/pyo3-pytests/src/datetime.rs @@ -3,7 +3,6 @@ use pyo3::types::{ PyDate, PyDateAccess, PyDateTime, PyDelta, PyDeltaAccess, PyTime, PyTimeAccess, PyTuple, PyTzInfo, }; -use pyo3::wrap_pyfunction; #[pyfunction] fn make_date(py: Python, year: i32, month: u8, day: u8) -> PyResult<&PyDate> { diff --git a/examples/pyo3-pytests/src/misc.rs b/examples/pyo3-pytests/src/misc.rs index 33ad86d0..59dc63b6 100644 --- a/examples/pyo3-pytests/src/misc.rs +++ b/examples/pyo3-pytests/src/misc.rs @@ -1,5 +1,4 @@ use pyo3::prelude::*; -use pyo3::wrap_pyfunction; #[pyfunction] fn issue_219() { diff --git a/examples/pyo3-pytests/src/othermod.rs b/examples/pyo3-pytests/src/othermod.rs index 5c149d29..ba6319fe 100644 --- a/examples/pyo3-pytests/src/othermod.rs +++ b/examples/pyo3-pytests/src/othermod.rs @@ -3,7 +3,6 @@ //! The code below just tries to use the most important code generation paths use pyo3::prelude::*; -use pyo3::wrap_pyfunction; #[pyclass] pub struct ModClass { diff --git a/examples/pyo3-pytests/src/path.rs b/examples/pyo3-pytests/src/path.rs index d3214aa0..3f2a22fc 100644 --- a/examples/pyo3-pytests/src/path.rs +++ b/examples/pyo3-pytests/src/path.rs @@ -1,5 +1,4 @@ use pyo3::prelude::*; -use pyo3::wrap_pyfunction; use std::path::{Path, PathBuf}; #[pyfunction] diff --git a/examples/word-count/src/lib.rs b/examples/word-count/src/lib.rs index 36ae89ef..1a078c6b 100644 --- a/examples/word-count/src/lib.rs +++ b/examples/word-count/src/lib.rs @@ -2,7 +2,6 @@ // https://github.com/tildeio/helix-website/blob/master/crates/word_count/src/lib.rs use pyo3::prelude::*; -use pyo3::wrap_pyfunction; use rayon::prelude::*; /// Searches for the word, parallelized by rayon diff --git a/guide/src/ecosystem/logging.md b/guide/src/ecosystem/logging.md index 500a8804..d0ecface 100644 --- a/guide/src/ecosystem/logging.md +++ b/guide/src/ecosystem/logging.md @@ -21,7 +21,6 @@ It's also possible to tweak its configuration (mostly to tune its performance). ```rust use log::info; use pyo3::prelude::*; -use pyo3::wrap_pyfunction; #[pyfunction] fn log_something() { diff --git a/guide/src/function.md b/guide/src/function.md index d3355a54..2393b946 100644 --- a/guide/src/function.md +++ b/guide/src/function.md @@ -6,7 +6,6 @@ One way is annotating a function with `#[pyfunction]` and then adding it to the ```rust use pyo3::prelude::*; -use pyo3::wrap_pyfunction; #[pyfunction] fn double(x: usize) -> usize { @@ -54,7 +53,7 @@ fn rust2py(py: Python, m: &PyModule) -> PyResult<()> { Ok(format!("{}", a + b)) } - m.add_function(pyo3::wrap_pyfunction!(sum_as_string, m)?)?; + m.add_function(wrap_pyfunction!(sum_as_string, m)?)?; Ok(()) } @@ -72,7 +71,6 @@ The `#[pyo3]` attribute can be used to modify properties of the generated Python ```rust use pyo3::prelude::*; - use pyo3::wrap_pyfunction; #[pyfunction] #[pyo3(name = "no_args")] @@ -97,7 +95,6 @@ The `#[pyfunction]` attribute supports specifying details of argument parsing. T ```rust use pyo3::prelude::*; -use pyo3::wrap_pyfunction; use pyo3::types::PyDict; #[pyfunction(kwds="**")] @@ -258,7 +255,6 @@ in Python code. It is possible to access the module of a `#[pyfunction]` in the function body by using `#[pyo3(pass_module)]` option: ```rust -use pyo3::wrap_pyfunction; use pyo3::prelude::*; #[pyfunction] diff --git a/guide/src/module.md b/guide/src/module.md index 4a8d9c1e..330e1bb5 100644 --- a/guide/src/module.md +++ b/guide/src/module.md @@ -66,7 +66,7 @@ dicts or other modules: ```rust use pyo3::prelude::*; -use pyo3::{wrap_pyfunction, wrap_pymodule}; +use pyo3::wrap_pymodule; use pyo3::types::IntoPyDict; #[pyfunction] diff --git a/guide/src/trait_bounds.md b/guide/src/trait_bounds.md index 10e9ab72..c9c47d39 100644 --- a/guide/src/trait_bounds.md +++ b/guide/src/trait_bounds.md @@ -461,7 +461,6 @@ It is also required to make the struct public. ```rust use pyo3::prelude::*; -use pyo3::wrap_pyfunction; use pyo3::types::PyAny; pub trait Model { diff --git a/src/lib.rs b/src/lib.rs index 3dc0fb2f..83b48cb9 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -157,7 +157,6 @@ //! //! ```rust //! use pyo3::prelude::*; -//! use pyo3::wrap_pyfunction; //! //! /// Formats the sum of two numbers as string. //! #[pyfunction] diff --git a/src/num_bigint.rs b/src/num_bigint.rs index aa205025..2252338b 100644 --- a/src/num_bigint.rs +++ b/src/num_bigint.rs @@ -34,7 +34,6 @@ //! ```rust //! use num_bigint::BigInt; //! use pyo3::prelude::*; -//! use pyo3::wrap_pyfunction; //! //! #[pyfunction] //! fn add_one(n: BigInt) -> BigInt { diff --git a/src/num_complex.rs b/src/num_complex.rs index 4e4776a0..5cb45dec 100644 --- a/src/num_complex.rs +++ b/src/num_complex.rs @@ -31,7 +31,6 @@ //! use nalgebra::base::{dimension::Const, storage::Storage, Matrix}; //! use num_complex::Complex; //! use pyo3::prelude::*; -//! use pyo3::wrap_pyfunction; //! //! type T = Complex; //! diff --git a/src/prelude.rs b/src/prelude.rs index 15dbcc7c..04eae682 100644 --- a/src/prelude.rs +++ b/src/prelude.rs @@ -19,5 +19,6 @@ pub use crate::python::Python; pub use crate::{FromPyObject, IntoPy, IntoPyPointer, PyTryFrom, PyTryInto, ToPyObject}; // PyModule is only part of the prelude because we need it for the pymodule function pub use crate::types::{PyAny, PyModule}; +pub use crate::wrap_pyfunction; #[cfg(feature = "macros")] pub use {crate::proc_macro::*, pyo3_macros::FromPyObject}; diff --git a/src/python.rs b/src/python.rs index 8b1cff18..62d24774 100644 --- a/src/python.rs +++ b/src/python.rs @@ -189,7 +189,7 @@ impl<'p> Python<'p> { /// /// # Examples /// ``` - /// # use pyo3::prelude::*; use pyo3::types::IntoPyDict; use pyo3::wrap_pyfunction; + /// # use pyo3::prelude::*; use pyo3::types::IntoPyDict; /// use pyo3::exceptions::PyRuntimeError; /// use std::sync::Arc; /// use std::thread; diff --git a/src/types/module.rs b/src/types/module.rs index 23b10028..44a01998 100644 --- a/src/types/module.rs +++ b/src/types/module.rs @@ -346,7 +346,6 @@ impl PyModule { /// /// ```rust /// use pyo3::prelude::*; - /// use pyo3::wrap_pyfunction; /// /// #[pyfunction] /// fn say_hello() { diff --git a/tests/test_bytes.rs b/tests/test_bytes.rs index e458e35b..a9300cec 100644 --- a/tests/test_bytes.rs +++ b/tests/test_bytes.rs @@ -1,6 +1,5 @@ use pyo3::prelude::*; use pyo3::types::PyBytes; -use pyo3::wrap_pyfunction; mod common; diff --git a/tests/test_exceptions.rs b/tests/test_exceptions.rs index 710b1705..ad7885c2 100644 --- a/tests/test_exceptions.rs +++ b/tests/test_exceptions.rs @@ -1,5 +1,5 @@ use pyo3::prelude::*; -use pyo3::{exceptions, py_run, wrap_pyfunction, PyErr, PyResult}; +use pyo3::{exceptions, py_run, PyErr, PyResult}; use std::error::Error; use std::fmt; #[cfg(not(target_os = "windows"))] diff --git a/tests/test_macros.rs b/tests/test_macros.rs index 46c31b4c..78d68ab5 100644 --- a/tests/test_macros.rs +++ b/tests/test_macros.rs @@ -1,7 +1,6 @@ //! Ensure that pyo3 macros can be used inside macro_rules! use pyo3::prelude::*; -use pyo3::wrap_pyfunction; #[macro_use] mod common; diff --git a/tests/test_module.rs b/tests/test_module.rs index ffb065b2..bd6a5528 100644 --- a/tests/test_module.rs +++ b/tests/test_module.rs @@ -1,7 +1,7 @@ use pyo3::prelude::*; +use pyo3::py_run; use pyo3::types::{IntoPyDict, PyDict, PyTuple}; -use pyo3::{py_run, wrap_pyfunction}; mod common; #[pyclass] diff --git a/tests/test_pyfunction.rs b/tests/test_pyfunction.rs index 7f9dadd2..d3cecdb4 100644 --- a/tests/test_pyfunction.rs +++ b/tests/test_pyfunction.rs @@ -4,7 +4,6 @@ use pyo3::prelude::*; use pyo3::types::PyCFunction; #[cfg(not(Py_LIMITED_API))] use pyo3::types::{PyDateTime, PyFunction}; -use pyo3::wrap_pyfunction; mod common; diff --git a/tests/test_string.rs b/tests/test_string.rs index 63f78661..f1ee07e9 100644 --- a/tests/test_string.rs +++ b/tests/test_string.rs @@ -1,5 +1,4 @@ use pyo3::prelude::*; -use pyo3::wrap_pyfunction; mod common; diff --git a/tests/test_text_signature.rs b/tests/test_text_signature.rs index 1c55216f..5d537eed 100644 --- a/tests/test_text_signature.rs +++ b/tests/test_text_signature.rs @@ -1,5 +1,5 @@ use pyo3::prelude::*; -use pyo3::{types::PyType, wrap_pyfunction, wrap_pymodule, PyCell}; +use pyo3::{types::PyType, wrap_pymodule, PyCell}; mod common; diff --git a/tests/test_various.rs b/tests/test_various.rs index 04c8dc82..6e570fa2 100644 --- a/tests/test_various.rs +++ b/tests/test_various.rs @@ -1,6 +1,6 @@ use pyo3::prelude::*; use pyo3::types::{PyDict, PyTuple}; -use pyo3::{py_run, wrap_pyfunction, PyCell}; +use pyo3::{py_run, PyCell}; use std::fmt; diff --git a/tests/test_wrap_pyfunction_deduction.rs b/tests/test_wrap_pyfunction_deduction.rs index c561a419..010a76e1 100644 --- a/tests/test_wrap_pyfunction_deduction.rs +++ b/tests/test_wrap_pyfunction_deduction.rs @@ -1,4 +1,4 @@ -use pyo3::{prelude::*, types::PyCFunction, wrap_pyfunction}; +use pyo3::{prelude::*, types::PyCFunction}; #[pyfunction] fn f() {} diff --git a/tests/ui/invalid_result_conversion.rs b/tests/ui/invalid_result_conversion.rs index 3da4d217..c053edea 100644 --- a/tests/ui/invalid_result_conversion.rs +++ b/tests/ui/invalid_result_conversion.rs @@ -2,7 +2,6 @@ //! *doesn't* implement `From for PyErr` won't be automatically //! converted when using `#[pyfunction]`. use pyo3::prelude::*; -use pyo3::wrap_pyfunction; use std::fmt; diff --git a/tests/ui/invalid_result_conversion.stderr b/tests/ui/invalid_result_conversion.stderr index 227aa02c..c422e27d 100644 --- a/tests/ui/invalid_result_conversion.stderr +++ b/tests/ui/invalid_result_conversion.stderr @@ -1,7 +1,7 @@ error[E0277]: the trait bound `Result<(), MyError>: IntoPyCallbackOutput<_>` is not satisfied - --> $DIR/invalid_result_conversion.rs:22:1 + --> $DIR/invalid_result_conversion.rs:21:1 | -22 | #[pyfunction] +21 | #[pyfunction] | ^^^^^^^^^^^^^ the trait `IntoPyCallbackOutput<_>` is not implemented for `Result<(), MyError>` | ::: $WORKSPACE/src/callback.rs