diff --git a/src/buffer.rs b/src/buffer.rs index 915375facf7..70cb8faa638 100644 --- a/src/buffer.rs +++ b/src/buffer.rs @@ -22,6 +22,7 @@ //! `PyBuffer` implementation #[cfg(feature = "experimental-inspect")] use crate::inspect::{type_hint_identifier, PyStaticExpr}; +use crate::platform::prelude::*; use crate::{err, exceptions::PyBufferError, ffi, FromPyObject, PyAny, PyResult, Python}; use crate::{Borrowed, Bound, PyErr}; use core::ffi::{ diff --git a/src/byteswriter.rs b/src/byteswriter.rs index d65e600f283..1d942135675 100644 --- a/src/byteswriter.rs +++ b/src/byteswriter.rs @@ -3,6 +3,8 @@ #[cfg(feature = "experimental-inspect")] use crate::inspect::PyStaticExpr; +#[allow(unused_imports, reason = "conditionally used")] +use crate::platform::prelude::*; #[cfg(feature = "experimental-inspect")] use crate::PyTypeInfo; #[cfg(not(Py_LIMITED_API))] diff --git a/src/conversion.rs b/src/conversion.rs index 200793ab81f..5d910532f3d 100644 --- a/src/conversion.rs +++ b/src/conversion.rs @@ -3,6 +3,7 @@ use crate::err::PyResult; use crate::impl_::pyclass::ExtractPyClassWithClone; #[cfg(feature = "experimental-inspect")] use crate::inspect::{type_hint_identifier, type_hint_subscript, PyStaticExpr}; +use crate::platform::prelude::*; use crate::pyclass::boolean_struct::False; use crate::pyclass::{PyClassGuardError, PyClassGuardMutError}; use crate::types::PyList; @@ -441,6 +442,7 @@ pub trait FromPyObject<'a, 'py>: Sized { } mod from_py_object_sequence { + use crate::platform::prelude::*; use crate::PyResult; /// Private trait for implementing specialized sequence extraction for `Vec` and `[u8; N]` diff --git a/src/conversions/anyhow.rs b/src/conversions/anyhow.rs index 2ff959546ef..8d2a8279e33 100644 --- a/src/conversions/anyhow.rs +++ b/src/conversions/anyhow.rs @@ -120,6 +120,7 @@ impl From for PyErr { #[cfg(test)] mod test_anyhow { use crate::exceptions::{PyRuntimeError, PyValueError}; + use crate::platform::prelude::*; use crate::prelude::*; use crate::types::IntoPyDict; diff --git a/src/conversions/bigdecimal.rs b/src/conversions/bigdecimal.rs index c25d3d01e97..82165323d79 100644 --- a/src/conversions/bigdecimal.rs +++ b/src/conversions/bigdecimal.rs @@ -53,6 +53,7 @@ use core::str::FromStr; #[cfg(feature = "experimental-inspect")] use crate::inspect::PyStaticExpr; +use crate::platform::prelude::*; #[cfg(feature = "experimental-inspect")] use crate::type_hint_identifier; use crate::types::PyTuple; diff --git a/src/conversions/bytes.rs b/src/conversions/bytes.rs index 20f4d1ccc4d..2dc50ea7eba 100644 --- a/src/conversions/bytes.rs +++ b/src/conversions/bytes.rs @@ -70,6 +70,8 @@ use crate::conversion::IntoPyObject; #[cfg(feature = "experimental-inspect")] use crate::inspect::PyStaticExpr; use crate::instance::Bound; +#[allow(unused_imports, reason = "used to build docs")] +use crate::platform::prelude::*; use crate::pybacked::PyBackedBytes; use crate::types::PyBytes; #[cfg(feature = "experimental-inspect")] diff --git a/src/conversions/chrono.rs b/src/conversions/chrono.rs index 6b3845394c8..d24122b5384 100644 --- a/src/conversions/chrono.rs +++ b/src/conversions/chrono.rs @@ -714,9 +714,9 @@ fn py_datetime_to_datetime_with_timezone( #[cfg(test)] mod tests { use super::*; + use crate::platform::prelude::*; use crate::{test_utils::assert_warnings, types::PyTuple, BoundObject}; use core::cmp::Ordering; - use std::panic; #[test] // Only Python>=3.9 has the zoneinfo package @@ -898,9 +898,9 @@ mod tests { Python::attach(|py| { let low_days: i32 = -1000000000; // This is possible - assert!(panic::catch_unwind(|| Duration::days(low_days as i64)).is_ok()); + assert!(std::panic::catch_unwind(|| Duration::days(low_days as i64)).is_ok()); // This panics on PyDelta::new - assert!(panic::catch_unwind(|| { + assert!(std::panic::catch_unwind(|| { let py_delta = new_py_datetime_ob(py, "timedelta", (low_days, 0, 0)); if let Ok(_duration) = py_delta.extract::() { // So we should never get here @@ -910,9 +910,9 @@ mod tests { let high_days: i32 = 1000000000; // This is possible - assert!(panic::catch_unwind(|| Duration::days(high_days as i64)).is_ok()); + assert!(std::panic::catch_unwind(|| Duration::days(high_days as i64)).is_ok()); // This panics on PyDelta::new - assert!(panic::catch_unwind(|| { + assert!(std::panic::catch_unwind(|| { let py_delta = new_py_datetime_ob(py, "timedelta", (high_days, 0, 0)); if let Ok(_duration) = py_delta.extract::() { // So we should never get here diff --git a/src/conversions/chrono_tz.rs b/src/conversions/chrono_tz.rs index 153e48817a0..00c15da9e31 100644 --- a/src/conversions/chrono_tz.rs +++ b/src/conversions/chrono_tz.rs @@ -38,6 +38,7 @@ use crate::conversion::IntoPyObject; use crate::exceptions::PyValueError; #[cfg(feature = "experimental-inspect")] use crate::inspect::PyStaticExpr; +use crate::platform::prelude::*; #[cfg(feature = "experimental-inspect")] use crate::type_hint_identifier; use crate::types::{any::PyAnyMethods, PyTzInfo}; diff --git a/src/conversions/either.rs b/src/conversions/either.rs index 5c40511a60e..e56775a0d7d 100644 --- a/src/conversions/either.rs +++ b/src/conversions/either.rs @@ -131,6 +131,7 @@ mod tests { use alloc::borrow::Cow; use crate::exceptions::PyTypeError; + use crate::platform::prelude::*; use crate::{IntoPyObject, Python}; use crate::types::PyAnyMethods; diff --git a/src/conversions/eyre.rs b/src/conversions/eyre.rs index 1aaaaf0d176..b4baeb5cf57 100644 --- a/src/conversions/eyre.rs +++ b/src/conversions/eyre.rs @@ -126,6 +126,7 @@ impl From for PyErr { #[cfg(test)] mod tests { use crate::exceptions::{PyRuntimeError, PyValueError}; + use crate::platform::prelude::*; use crate::prelude::*; use crate::types::IntoPyDict; diff --git a/src/conversions/jiff.rs b/src/conversions/jiff.rs index 593811f7641..69b81af251f 100644 --- a/src/conversions/jiff.rs +++ b/src/conversions/jiff.rs @@ -48,6 +48,7 @@ use crate::exceptions::{PyTypeError, PyValueError}; #[cfg(feature = "experimental-inspect")] use crate::inspect::PyStaticExpr; +use crate::platform::prelude::*; use crate::types::{PyAnyMethods, PyNone}; use crate::types::{PyDate, PyDateTime, PyDelta, PyTime, PyTzInfo, PyTzInfoAccess}; #[cfg(not(Py_LIMITED_API))] diff --git a/src/conversions/num_bigint.rs b/src/conversions/num_bigint.rs index 2a0c101ef89..a5172e6ef3a 100644 --- a/src/conversions/num_bigint.rs +++ b/src/conversions/num_bigint.rs @@ -49,11 +49,13 @@ //! assert n + 1 == value //! ``` +#[allow(unused_imports, reason = "conditionally used")] +use crate::platform::prelude::*; #[cfg(Py_LIMITED_API)] use crate::types::{bytes::PyBytesMethods, PyBytes}; use crate::{ - conversion::IntoPyObject, std::num::nb_index, types::PyInt, Borrowed, Bound, FromPyObject, - PyAny, PyErr, PyResult, Python, + conversion::IntoPyObject, conversions::std::num::nb_index, types::PyInt, Borrowed, Bound, + FromPyObject, PyAny, PyErr, PyResult, Python, }; use num_bigint::{BigInt, BigUint}; @@ -437,7 +439,7 @@ class C: macro_rules! test { ($T:ty, $value:expr, $py:expr) => { let value = $value; - println!("{}: {}", stringify!($T), value); + std::println!("{}: {}", stringify!($T), value); let python_value = value.clone().into_pyobject(py).unwrap(); let roundtrip_value = python_value.extract::<$T>().unwrap(); assert_eq!(value, roundtrip_value); diff --git a/src/conversions/ordered_float.rs b/src/conversions/ordered_float.rs index 25391627a5f..754a1c56aba 100644 --- a/src/conversions/ordered_float.rs +++ b/src/conversions/ordered_float.rs @@ -55,6 +55,7 @@ use crate::conversion::IntoPyObject; use crate::exceptions::PyValueError; #[cfg(feature = "experimental-inspect")] use crate::inspect::PyStaticExpr; +use crate::platform::prelude::*; use crate::types::PyFloat; use crate::{Borrowed, Bound, FromPyObject, PyAny, Python}; use core::convert::Infallible; diff --git a/src/conversions/rust_decimal.rs b/src/conversions/rust_decimal.rs index 101ac354dbb..abd2dda3e60 100644 --- a/src/conversions/rust_decimal.rs +++ b/src/conversions/rust_decimal.rs @@ -53,6 +53,7 @@ use crate::conversion::IntoPyObject; use crate::exceptions::PyValueError; #[cfg(feature = "experimental-inspect")] use crate::inspect::PyStaticExpr; +use crate::platform::prelude::*; use crate::sync::PyOnceLock; #[cfg(feature = "experimental-inspect")] use crate::type_hint_identifier; diff --git a/src/conversions/serde.rs b/src/conversions/serde.rs index bb3f4f1c58f..bdc92ee18b3 100644 --- a/src/conversions/serde.rs +++ b/src/conversions/serde.rs @@ -12,6 +12,7 @@ //! serde = "1.0" //! ``` +use crate::platform::prelude::*; use crate::{Py, PyAny, PyClass, Python}; use serde::{de, ser, Deserialize, Deserializer, Serialize, Serializer}; diff --git a/src/conversions/smallvec.rs b/src/conversions/smallvec.rs index fd8250d83d9..63a1f561784 100644 --- a/src/conversions/smallvec.rs +++ b/src/conversions/smallvec.rs @@ -110,6 +110,7 @@ where #[cfg(test)] mod tests { use super::*; + use crate::platform::prelude::*; use crate::types::{PyBytes, PyBytesMethods, PyDict, PyList}; #[test] diff --git a/src/conversions/std/array.rs b/src/conversions/std/array.rs index b624ead05f8..4d9b5fae597 100644 --- a/src/conversions/std/array.rs +++ b/src/conversions/std/array.rs @@ -135,6 +135,7 @@ pub(crate) fn invalid_sequence_length(expected: usize, actual: usize) -> PyErr { #[cfg(test)] mod tests { + use crate::platform::prelude::*; #[cfg(panic = "unwind")] use core::sync::atomic::{AtomicUsize, Ordering}; #[cfg(panic = "unwind")] diff --git a/src/conversions/std/cstring.rs b/src/conversions/std/cstring.rs index 8ff48a51272..07173d7cd9f 100644 --- a/src/conversions/std/cstring.rs +++ b/src/conversions/std/cstring.rs @@ -1,6 +1,8 @@ use crate::exceptions::PyUnicodeDecodeError; #[cfg(feature = "experimental-inspect")] use crate::inspect::PyStaticExpr; +#[allow(unused_imports, reason = "conditionally used")] +use crate::platform::prelude::*; #[cfg(feature = "experimental-inspect")] use crate::type_object::PyTypeInfo; use crate::types::PyString; diff --git a/src/conversions/std/num.rs b/src/conversions/std/num.rs index 50e72cca5f9..e6e2ccabc8e 100644 --- a/src/conversions/std/num.rs +++ b/src/conversions/std/num.rs @@ -6,6 +6,7 @@ use crate::conversion::{FromPyObjectSequence, IntoPyObject}; use crate::ffi_ptr_ext::FfiPtrExt; #[cfg(feature = "experimental-inspect")] use crate::inspect::PyStaticExpr; +use crate::platform::prelude::*; use crate::py_result_ext::PyResultExt; #[cfg(feature = "experimental-inspect")] use crate::type_object::PyTypeInfo; diff --git a/src/conversions/std/osstr.rs b/src/conversions/std/osstr.rs index 113673a6ec9..84e2d44fbee 100644 --- a/src/conversions/std/osstr.rs +++ b/src/conversions/std/osstr.rs @@ -9,6 +9,8 @@ use crate::ffi_ptr_ext::FfiPtrExt; #[cfg(feature = "experimental-inspect")] use crate::inspect::PyStaticExpr; use crate::instance::Bound; +#[allow(unused_imports, reason = "conditionally used")] +use crate::platform::prelude::*; #[cfg(feature = "experimental-inspect")] use crate::type_object::PyTypeInfo; use crate::types::PyString; @@ -229,6 +231,8 @@ impl<'py> IntoPyObject<'py> for &OsString { mod tests { #[cfg(target_os = "wasi")] use crate::exceptions::PyFileNotFoundError; + #[allow(unused_imports, reason = "conditionally used")] + use crate::platform::prelude::*; use crate::types::{PyAnyMethods, PyString, PyStringMethods}; use crate::{Bound, BoundObject, IntoPyObject, Python}; use alloc::borrow::Cow; diff --git a/src/conversions/std/slice.rs b/src/conversions/std/slice.rs index 7e8bed5bdc4..2a58e886c8b 100644 --- a/src/conversions/std/slice.rs +++ b/src/conversions/std/slice.rs @@ -1,3 +1,4 @@ +use crate::platform::prelude::*; use alloc::borrow::Cow; #[cfg(feature = "experimental-inspect")] diff --git a/src/conversions/std/string.rs b/src/conversions/std/string.rs index 25ea3824e85..15cd5d800d4 100644 --- a/src/conversions/std/string.rs +++ b/src/conversions/std/string.rs @@ -1,5 +1,6 @@ #[cfg(feature = "experimental-inspect")] use crate::inspect::PyStaticExpr; +use crate::platform::prelude::*; #[cfg(feature = "experimental-inspect")] use crate::type_object::PyTypeInfo; use crate::{ @@ -177,6 +178,7 @@ impl FromPyObject<'_, '_> for char { #[cfg(test)] mod tests { + use crate::platform::prelude::*; use crate::types::any::PyAnyMethods; use crate::{IntoPyObject, Python}; use alloc::borrow::Cow; diff --git a/src/conversions/std/time.rs b/src/conversions/std/time.rs index 12a3cb15dfd..813001cece1 100644 --- a/src/conversions/std/time.rs +++ b/src/conversions/std/time.rs @@ -164,6 +164,7 @@ fn unix_epoch_py(py: Python<'_>) -> PyResult> { #[cfg(test)] mod tests { use super::*; + use crate::platform::prelude::*; use crate::types::PyDict; #[test] diff --git a/src/conversions/std/vec.rs b/src/conversions/std/vec.rs index 8a7a6945f2c..fa35e2f32f5 100644 --- a/src/conversions/std/vec.rs +++ b/src/conversions/std/vec.rs @@ -3,6 +3,7 @@ #[cfg(feature = "experimental-inspect")] use crate::inspect::{type_hint_subscript, PyStaticExpr}; +use crate::platform::prelude::*; use crate::{ conversion::{FromPyObject, FromPyObjectOwned, FromPyObjectSequence, IntoPyObject}, exceptions::PyTypeError, @@ -95,6 +96,7 @@ where #[cfg(test)] mod tests { use crate::conversion::IntoPyObject; + use crate::platform::prelude::*; use crate::types::{PyAnyMethods, PyBytes, PyBytesMethods, PyList}; use crate::Python; diff --git a/src/coroutine.rs b/src/coroutine.rs index 4b5bc42048d..ba018ce960a 100644 --- a/src/coroutine.rs +++ b/src/coroutine.rs @@ -10,6 +10,7 @@ use core::{ use pyo3_macros::{pyclass, pymethods}; +use crate::platform::prelude::*; use crate::{ coroutine::{cancel::ThrowCallback, waker::AsyncioWaker}, exceptions::{PyAttributeError, PyRuntimeError, PyStopIteration}, diff --git a/src/err/cast_error.rs b/src/err/cast_error.rs index dd09580f36c..c9f67c5487b 100644 --- a/src/err/cast_error.rs +++ b/src/err/cast_error.rs @@ -1,3 +1,4 @@ +use crate::platform::prelude::*; use alloc::borrow::Cow; use crate::{ diff --git a/src/err/err_state.rs b/src/err/err_state.rs index 4deea979b83..2efc43ed4f5 100644 --- a/src/err/err_state.rs +++ b/src/err/err_state.rs @@ -1,6 +1,7 @@ // TODO https://github.com/PyO3/pyo3/issues/5487 #![allow(clippy::undocumented_unsafe_blocks)] +use crate::platform::prelude::*; use core::cell::UnsafeCell; use std::{ sync::{Mutex, Once}, @@ -408,7 +409,8 @@ fn raise_lazy(py: Python<'_>, lazy: Box) { #[cfg(test)] mod tests { - + #[allow(unused_imports, reason = "conditionally used")] + use crate::platform::prelude::*; use crate::{ exceptions::PyValueError, sync::PyOnceLock, Py, PyAny, PyErr, PyErrArguments, Python, }; diff --git a/src/err/impls.rs b/src/err/impls.rs index bdd587eb02a..fe703fcbbfa 100644 --- a/src/err/impls.rs +++ b/src/err/impls.rs @@ -1,3 +1,4 @@ +use crate::platform::prelude::*; use crate::{err::PyErrArguments, exceptions, types, PyErr, Python}; use crate::{IntoPyObject, Py, PyAny}; use std::io; diff --git a/src/err/mod.rs b/src/err/mod.rs index be2ed2ddd23..c80e5cebffa 100644 --- a/src/err/mod.rs +++ b/src/err/mod.rs @@ -9,6 +9,7 @@ use crate::instance::Bound; #[cfg(Py_3_11)] use crate::intern; use crate::panic::PanicException; +use crate::platform::prelude::*; use crate::py_result_ext::PyResultExt; use crate::type_object::PyTypeInfo; use crate::types::any::PyAnyMethods; @@ -798,6 +799,7 @@ mod tests { use super::PyErrState; use crate::exceptions::{self, PyTypeError, PyValueError}; use crate::impl_::pyclass::{value_of, IsSend, IsSync}; + use crate::platform::prelude::*; use crate::test_utils::assert_warnings; use crate::{PyErr, PyTypeInfo, Python}; diff --git a/src/exceptions.rs b/src/exceptions.rs index 94d6c0e2c72..981f37273f6 100644 --- a/src/exceptions.rs +++ b/src/exceptions.rs @@ -947,6 +947,7 @@ pub mod socket { #[cfg(test)] mod tests { use super::*; + use crate::platform::prelude::*; use crate::types::any::PyAnyMethods; use crate::types::{IntoPyDict, PyDict}; use crate::{IntoPyObjectExt as _, PyErr}; diff --git a/src/fmt.rs b/src/fmt.rs index 326465e0f43..7cb11565345 100644 --- a/src/fmt.rs +++ b/src/fmt.rs @@ -1,6 +1,8 @@ // TODO https://github.com/PyO3/pyo3/issues/5487 #![allow(clippy::undocumented_unsafe_blocks)] +#[allow(unused_imports, reason = "used to build docs")] +use crate::platform::prelude::*; #[cfg(any(doc, all(Py_3_14, not(Py_LIMITED_API))))] use crate::{types::PyString, Python}; #[cfg(all(Py_3_14, not(Py_LIMITED_API)))] @@ -42,12 +44,11 @@ macro_rules! py_format { ($py: expr, $($arg:tt)*) => {{ if let Some(static_string) = format_args!($($arg)*).as_str() { static INTERNED: $crate::sync::PyOnceLock<$crate::Py<$crate::types::PyString>> = $crate::sync::PyOnceLock::new(); - Ok( + Ok($crate::Bound::clone( INTERNED .get_or_init($py, || $crate::types::PyString::intern($py, static_string).unbind()) .bind($py) - .to_owned() - ) + )) } else { $crate::types::PyString::from_fmt($py, format_args!($($arg)*)) } diff --git a/src/impl_/extract_argument.rs b/src/impl_/extract_argument.rs index 2335b2c6f7b..361a427bb56 100644 --- a/src/impl_/extract_argument.rs +++ b/src/impl_/extract_argument.rs @@ -1,6 +1,7 @@ // TODO https://github.com/PyO3/pyo3/issues/5487 #![allow(clippy::undocumented_unsafe_blocks)] +use crate::platform::prelude::*; use core::ptr::NonNull; #[cfg(feature = "experimental-inspect")] @@ -1021,6 +1022,7 @@ fn push_parameter_list(msg: &mut String, parameter_names: &[&str]) { #[cfg(test)] mod tests { + use crate::platform::prelude::*; use crate::types::{IntoPyDict, PyTuple}; use crate::Python; diff --git a/src/impl_/freelist.rs b/src/impl_/freelist.rs index 1337e9404cd..255226b84ba 100644 --- a/src/impl_/freelist.rs +++ b/src/impl_/freelist.rs @@ -9,6 +9,7 @@ //! [1]: https://en.wikipedia.org/wiki/Free_list use crate::ffi; +use crate::platform::prelude::*; use core::ptr::NonNull; /// A free allocation list for PyObject ffi pointers. diff --git a/src/impl_/frompyobject.rs b/src/impl_/frompyobject.rs index 26013035d48..7a675bbf47a 100644 --- a/src/impl_/frompyobject.rs +++ b/src/impl_/frompyobject.rs @@ -1,3 +1,4 @@ +use crate::platform::prelude::*; use crate::types::any::PyAnyMethods; use crate::Bound; use crate::{exceptions::PyTypeError, FromPyObject, PyAny, PyErr, PyResult, Python}; diff --git a/src/impl_/pyclass.rs b/src/impl_/pyclass.rs index bc539a5d7d0..273bf25c3be 100644 --- a/src/impl_/pyclass.rs +++ b/src/impl_/pyclass.rs @@ -1,6 +1,8 @@ // TODO https://github.com/PyO3/pyo3/issues/5487 #![allow(clippy::undocumented_unsafe_blocks)] +#[allow(unused_imports, reason = "conditionally used")] +use crate::platform::prelude::*; use crate::{ exceptions::{PyAttributeError, PyNotImplementedError, PyRuntimeError}, ffi, diff --git a/src/impl_/pyclass/lazy_type_object.rs b/src/impl_/pyclass/lazy_type_object.rs index 63d92cd10b1..2142b1d4568 100644 --- a/src/impl_/pyclass/lazy_type_object.rs +++ b/src/impl_/pyclass/lazy_type_object.rs @@ -1,6 +1,7 @@ // TODO https://github.com/PyO3/pyo3/issues/5487 #![allow(clippy::undocumented_unsafe_blocks)] +use crate::platform::prelude::*; use core::{ffi::CStr, marker::PhantomData}; use std::thread::{self, ThreadId}; diff --git a/src/impl_/pymethods.rs b/src/impl_/pymethods.rs index 9493fb981e0..80675c93fb9 100644 --- a/src/impl_/pymethods.rs +++ b/src/impl_/pymethods.rs @@ -718,6 +718,9 @@ where #[cfg(test)] mod tests { + #[allow(unused_imports, reason = "conditionally used")] + use crate::platform::prelude::*; + #[test] #[cfg(any(Py_3_10, not(Py_LIMITED_API)))] fn test_fastcall_function_with_keywords() { diff --git a/src/impl_/pymodule.rs b/src/impl_/pymodule.rs index 8e52d1bf996..0ad7489fb5d 100644 --- a/src/impl_/pymodule.rs +++ b/src/impl_/pymodule.rs @@ -2,6 +2,8 @@ #![allow(clippy::undocumented_unsafe_blocks)] //! Implementation details of `#[pymodule]` which need to be accessible from proc-macro generated code. +#[allow(unused_imports, reason = "conditionally used")] +use crate::platform::prelude::*; use core::{ cell::UnsafeCell, ffi::CStr, diff --git a/src/impl_/trampoline.rs b/src/impl_/trampoline.rs index f1d9e040687..fb945b2ded5 100644 --- a/src/impl_/trampoline.rs +++ b/src/impl_/trampoline.rs @@ -8,6 +8,7 @@ use core::{any::Any, ffi::c_int, panic::UnwindSafe}; use crate::internal::state::AttachGuard; +use crate::platform::prelude::*; use crate::{ ffi, ffi_ptr_ext::FfiPtrExt, impl_::callback::PyCallbackOutput, impl_::panic::PanicTrap, panic::PanicException, types::PyModule, Bound, PyResult, Python, diff --git a/src/impl_/unindent.rs b/src/impl_/unindent.rs index d04bbf3071c..4b7a8740608 100644 --- a/src/impl_/unindent.rs +++ b/src/impl_/unindent.rs @@ -1,6 +1,7 @@ #![warn(clippy::undocumented_unsafe_blocks)] use crate::impl_::concat::slice_copy_from_slice; +use crate::platform::prelude::*; /// This is a reimplementation of the `indoc` crate's unindent functionality: /// diff --git a/src/impl_/wrap.rs b/src/impl_/wrap.rs index 7b423b216ff..7e463697bc1 100644 --- a/src/impl_/wrap.rs +++ b/src/impl_/wrap.rs @@ -174,6 +174,7 @@ impl UnknownReturnType { #[cfg(test)] mod tests { use super::*; + use crate::platform::prelude::*; #[test] fn wrap_option() { diff --git a/src/inspect.rs b/src/inspect.rs index 33f27e4e018..681073b650b 100644 --- a/src/inspect.rs +++ b/src/inspect.rs @@ -449,6 +449,7 @@ impl AsRef for PyClassNameStaticExpr { #[cfg(test)] mod tests { use super::*; + use crate::platform::prelude::*; #[test] fn test_to_string() { diff --git a/src/instance.rs b/src/instance.rs index 8aa8371d04f..b57e5dd07ee 100644 --- a/src/instance.rs +++ b/src/instance.rs @@ -6,6 +6,7 @@ use crate::err::{PyErr, PyResult}; use crate::impl_::pyclass::PyClassImpl; #[cfg(feature = "experimental-inspect")] use crate::inspect::PyStaticExpr; +use crate::platform::prelude::*; use crate::pycell::impl_::PyClassObjectLayout; use crate::pycell::{PyBorrowError, PyBorrowMutError}; use crate::pyclass::boolean_struct::{False, True}; @@ -2434,6 +2435,8 @@ mod tests { use super::{Bound, IntoPyObject, Py}; #[cfg(all(feature = "macros", panic = "unwind"))] use crate::exceptions::PyValueError; + #[allow(unused_imports, reason = "conditionally used")] + use crate::platform::prelude::*; use crate::test_utils::generate_unique_module_name; #[cfg(all(feature = "macros", panic = "unwind"))] use crate::test_utils::UnraisableCapture; diff --git a/src/internal/state.rs b/src/internal/state.rs index 9776c2b52ac..51dcb75a9f8 100644 --- a/src/internal/state.rs +++ b/src/internal/state.rs @@ -5,6 +5,7 @@ #[cfg(pyo3_disable_reference_pool)] use crate::impl_::panic::PanicTrap; +use crate::platform::prelude::*; use crate::{ffi, Python}; use core::cell::Cell; diff --git a/src/internal_tricks.rs b/src/internal_tricks.rs index 0d21c69dcc7..42d0373afb4 100644 --- a/src/internal_tricks.rs +++ b/src/internal_tricks.rs @@ -1,6 +1,7 @@ use core::ptr::NonNull; use crate::ffi::{self, Py_ssize_t, PY_SSIZE_T_MAX}; +use crate::platform::prelude::*; macro_rules! pyo3_exception { ($doc: expr, $name: ident, $base: ty) => { diff --git a/src/lib.rs b/src/lib.rs index 8dd6148b675..8622672dd25 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,3 +1,4 @@ +#![no_std] #![warn( clippy::alloc_instead_of_core, clippy::std_instead_of_alloc, @@ -341,7 +342,9 @@ #![doc = concat!("[Features chapter of the guide]: https://pyo3.rs/v", env!("CARGO_PKG_VERSION"), "/features.html#features-reference \"Features Reference - PyO3 user guide\"")] //! [`Ungil`]: crate::marker::Ungil +#[macro_use] extern crate alloc; +extern crate std; pub use crate::class::*; pub use crate::conversion::{FromPyObject, IntoPyObject, IntoPyObjectExt}; diff --git a/src/marker.rs b/src/marker.rs index 99d21bd1593..e3288dd667f 100644 --- a/src/marker.rs +++ b/src/marker.rs @@ -800,6 +800,7 @@ impl<'unbound> Python<'unbound> { #[cfg(test)] mod tests { use super::*; + use crate::platform::prelude::*; use crate::{ internal::state::ForbidAttaching, types::{IntoPyDict, PyList}, diff --git a/src/panic.rs b/src/panic.rs index 8a8c8e73b4b..c4ba1707737 100644 --- a/src/panic.rs +++ b/src/panic.rs @@ -1,5 +1,6 @@ //! Helper to convert Rust panics to Python exceptions. use crate::exceptions::PyBaseException; +use crate::platform::prelude::*; use crate::PyErr; use core::any::Any; diff --git a/src/platform.rs b/src/platform.rs index 8bec1fda621..ce48c2fe15d 100644 --- a/src/platform.rs +++ b/src/platform.rs @@ -1,6 +1,19 @@ //! This module is to support platform compatiblity with `no_std` environments. #![allow(unused_imports)] +/// This prelude is intended to be used instead of the prelude from `std`. +pub(crate) mod prelude { + pub use alloc::{ + borrow::ToOwned, + boxed::Box, + string::{String, ToString}, + vec::Vec, + }; + + // TODO find a `no_std` replacement for eprintln + pub use std::eprintln; +} + #[cfg(feature = "hashbrown")] pub use hashbrown::{HashMap, HashSet}; diff --git a/src/pybacked.rs b/src/pybacked.rs index 5b03bdcfcc9..2e1c06c2289 100644 --- a/src/pybacked.rs +++ b/src/pybacked.rs @@ -5,6 +5,7 @@ #[cfg(feature = "experimental-inspect")] use crate::inspect::PyStaticExpr; +use crate::platform::prelude::*; #[cfg(feature = "experimental-inspect")] use crate::type_hint_union; use crate::{ diff --git a/src/pycell.rs b/src/pycell.rs index 5b3edbc9b37..21c9bb71a6b 100644 --- a/src/pycell.rs +++ b/src/pycell.rs @@ -199,6 +199,7 @@ use crate::conversion::IntoPyObject; use crate::exceptions::PyRuntimeError; use crate::ffi_ptr_ext::FfiPtrExt; +use crate::platform::prelude::*; use crate::pyclass::{boolean_struct::False, PyClass}; use crate::{ffi, Borrowed, Bound, PyErr, Python}; use core::convert::Infallible; diff --git a/src/pycell/impl_.rs b/src/pycell/impl_.rs index 2475acd937f..cc2ef775baa 100644 --- a/src/pycell/impl_.rs +++ b/src/pycell/impl_.rs @@ -592,6 +592,8 @@ where mod tests { use super::*; + #[allow(unused_imports, reason = "conditionally used")] + use crate::platform::prelude::*; use crate::prelude::*; use crate::pyclass::boolean_struct::{False, True}; diff --git a/src/pyclass/create_type_object.rs b/src/pyclass/create_type_object.rs index 0f13bcb8832..417987f63d6 100644 --- a/src/pyclass/create_type_object.rs +++ b/src/pyclass/create_type_object.rs @@ -3,6 +3,7 @@ use crate::exceptions::PyAttributeError; use crate::impl_::pymethods::{Deleter, PyDeleterDef}; +use crate::platform::prelude::*; use crate::platform::HashMap; #[cfg(not(Py_3_10))] use crate::types::typeobject::PyTypeMethods; diff --git a/src/sync/critical_section.rs b/src/sync/critical_section.rs index f07c4af769d..5a761adb533 100644 --- a/src/sync/critical_section.rs +++ b/src/sync/critical_section.rs @@ -270,6 +270,8 @@ mod tests { use super::{with_critical_section, with_critical_section2}; #[cfg(all(not(Py_LIMITED_API), Py_3_14))] use super::{with_critical_section_mutex, with_critical_section_mutex2}; + #[allow(unused_imports, reason = "conditionally used")] + use crate::platform::prelude::*; #[cfg(all(not(Py_LIMITED_API), Py_3_14))] use crate::types::PyMutex; #[cfg(feature = "macros")] diff --git a/src/types/any.rs b/src/types/any.rs index b03fb2bbefe..5821c0d4984 100644 --- a/src/types/any.rs +++ b/src/types/any.rs @@ -1457,6 +1457,7 @@ impl<'py> Bound<'py, PyAny> { #[cfg(test)] mod tests { + use crate::platform::prelude::*; use crate::{ basic::CompareOp, test_utils::generate_unique_module_name, diff --git a/src/types/bytearray.rs b/src/types/bytearray.rs index 8755e380d1e..56ec3a82b29 100644 --- a/src/types/bytearray.rs +++ b/src/types/bytearray.rs @@ -1,6 +1,7 @@ use crate::err::{PyErr, PyResult}; use crate::ffi_ptr_ext::FfiPtrExt; use crate::instance::{Borrowed, Bound}; +use crate::platform::prelude::*; use crate::py_result_ext::PyResultExt; use crate::sync::critical_section::with_critical_section; use crate::{ffi, PyAny, Python}; diff --git a/src/types/bytes.rs b/src/types/bytes.rs index 2e01ddad3ce..ead1d6c87ce 100644 --- a/src/types/bytes.rs +++ b/src/types/bytes.rs @@ -1,6 +1,8 @@ use crate::byteswriter::PyBytesWriter; use crate::ffi_ptr_ext::FfiPtrExt; use crate::instance::{Borrowed, Bound}; +#[allow(unused_imports, reason = "used to build docs")] +use crate::platform::prelude::*; use crate::{ffi, Py, PyAny, PyResult, Python}; #[cfg(RustPython)] use crate::{ diff --git a/src/types/capsule.rs b/src/types/capsule.rs index 3edcca3735e..7c10b495fc7 100644 --- a/src/types/capsule.rs +++ b/src/types/capsule.rs @@ -3,6 +3,7 @@ use crate::exceptions::PySystemError; use crate::ffi_ptr_ext::FfiPtrExt; use crate::internal_tricks::box_into_non_null; +use crate::platform::prelude::*; use crate::py_result_ext::PyResultExt; use crate::{ffi, PyAny}; #[cfg(RustPython)] @@ -688,6 +689,7 @@ fn name_ptr(name: Option<&CStr>) -> *const c_char { #[cfg(test)] mod tests { + use crate::platform::prelude::*; use crate::prelude::PyModule; use crate::types::capsule::PyCapsuleMethods; use crate::types::module::PyModuleMethods; diff --git a/src/types/dict.rs b/src/types/dict.rs index 4fbcbe4b3cf..4df1a99132a 100644 --- a/src/types/dict.rs +++ b/src/types/dict.rs @@ -951,6 +951,7 @@ where #[cfg(test)] mod tests { use super::*; + use crate::platform::prelude::*; use crate::platform::HashMap; use crate::types::{PyAnyMethods as _, PyTuple}; use alloc::collections::BTreeMap; diff --git a/src/types/function.rs b/src/types/function.rs index 13b8bfb8f8c..1c82a2af238 100644 --- a/src/types/function.rs +++ b/src/types/function.rs @@ -1,5 +1,6 @@ use crate::ffi_ptr_ext::FfiPtrExt; use crate::impl_::pyfunction::create_py_c_function; +use crate::platform::prelude::*; use crate::py_result_ext::PyResultExt; use crate::types::capsule::PyCapsuleMethods; use crate::{ diff --git a/src/types/iterator.rs b/src/types/iterator.rs index 7408c43568a..7550b4b46e0 100644 --- a/src/types/iterator.rs +++ b/src/types/iterator.rs @@ -162,6 +162,8 @@ mod tests { #[cfg(all(not(PyPy), Py_3_10))] use super::PySendResult; use crate::exceptions::PyTypeError; + #[allow(unused_imports, reason = "conditionally used")] + use crate::platform::prelude::*; #[cfg(all(not(PyPy), Py_3_10))] use crate::types::PyNone; use crate::types::{PyAnyMethods, PyDict, PyList, PyListMethods}; diff --git a/src/types/list.rs b/src/types/list.rs index 07643c5dbc7..65a7c8c6c82 100644 --- a/src/types/list.rs +++ b/src/types/list.rs @@ -2,6 +2,8 @@ use crate::err::{self, PyResult}; use crate::ffi::{self, Py_ssize_t}; use crate::ffi_ptr_ext::FfiPtrExt; use crate::internal_tricks::get_ssize_index; +#[allow(unused_imports, reason = "used to build docs")] +use crate::platform::prelude::*; use crate::types::sequence::PySequenceMethods; use crate::types::{PySequence, PyTuple}; #[cfg(RustPython)] @@ -893,6 +895,7 @@ impl<'py> IntoIterator for &Bound<'py, PyList> { #[cfg(test)] mod tests { + use crate::platform::prelude::*; use crate::types::any::PyAnyMethods; use crate::types::list::PyListMethods; use crate::types::sequence::PySequenceMethods; diff --git a/src/types/mappingproxy.rs b/src/types/mappingproxy.rs index b7298cc902e..50a632a321b 100644 --- a/src/types/mappingproxy.rs +++ b/src/types/mappingproxy.rs @@ -148,6 +148,7 @@ impl<'py> Iterator for BoundMappingProxyIterator<'py, '_> { mod tests { use super::*; + use crate::platform::prelude::*; use crate::platform::HashMap; use crate::types::dict::*; use crate::Python; diff --git a/src/types/sequence.rs b/src/types/sequence.rs index 08104583607..77fcaa15f83 100644 --- a/src/types/sequence.rs +++ b/src/types/sequence.rs @@ -360,6 +360,7 @@ impl<'py> PySequenceMethods<'py> for Bound<'py, PySequence> { #[cfg(test)] mod tests { + use crate::platform::prelude::*; use crate::types::{PyAnyMethods, PyList, PySequence, PySequenceMethods, PyTuple}; use crate::{IntoPyObject, Py, PyAny, PyTypeInfo, Python}; use core::ptr; diff --git a/src/types/string.rs b/src/types/string.rs index 4efc3919cb1..aee6f08d424 100644 --- a/src/types/string.rs +++ b/src/types/string.rs @@ -2,6 +2,7 @@ use crate::exceptions::PyUnicodeDecodeError; use crate::ffi_ptr_ext::FfiPtrExt; use crate::instance::Borrowed; +use crate::platform::prelude::*; use crate::py_result_ext::PyResultExt; use crate::types::bytes::PyBytesMethods; use crate::types::PyBytes; diff --git a/src/types/traceback.rs b/src/types/traceback.rs index 2dc5e9fb620..c298d55bd19 100644 --- a/src/types/traceback.rs +++ b/src/types/traceback.rs @@ -1,4 +1,5 @@ use crate::err::{error_on_minusone, PyResult}; +use crate::platform::prelude::*; use crate::types::{any::PyAnyMethods, string::PyStringMethods, PyString}; use crate::{ffi, Bound, PyAny}; #[cfg(RustPython)] diff --git a/src/types/tuple.rs b/src/types/tuple.rs index 08256d7156d..437b0cc53de 100644 --- a/src/types/tuple.rs +++ b/src/types/tuple.rs @@ -4,6 +4,8 @@ use crate::ffi_ptr_ext::FfiPtrExt; use crate::inspect::{type_hint_subscript, PyStaticExpr}; use crate::instance::Borrowed; use crate::internal_tricks::get_ssize_index; +#[allow(unused_imports, reason = "used to build docs")] +use crate::platform::prelude::*; #[cfg(feature = "experimental-inspect")] use crate::type_object::PyTypeInfo; use crate::types::{sequence::PySequenceMethods, PyList, PySequence}; @@ -1064,6 +1066,7 @@ tuple_conversion!( #[cfg(test)] mod tests { + use crate::platform::prelude::*; use crate::platform::HashSet; use crate::types::{any::PyAnyMethods, tuple::PyTupleMethods, PyList, PyTuple}; use crate::{Bound, IntoPyObject, PyAny, Python}; diff --git a/src/types/weakref/anyref.rs b/src/types/weakref/anyref.rs index 938f63830bb..1ef7ed28d76 100644 --- a/src/types/weakref/anyref.rs +++ b/src/types/weakref/anyref.rs @@ -362,6 +362,8 @@ impl<'py> PyWeakrefMethods<'py> for Bound<'py, PyWeakref> { #[cfg(test)] mod tests { + #[allow(unused_imports, reason = "conditionally used")] + use crate::platform::prelude::*; use crate::types::any::{PyAny, PyAnyMethods}; use crate::types::weakref::{PyWeakref, PyWeakrefMethods, PyWeakrefProxy, PyWeakrefReference}; use crate::{Bound, PyResult, Python}; diff --git a/src/types/weakref/proxy.rs b/src/types/weakref/proxy.rs index 76599de65b5..aeba3f03dde 100644 --- a/src/types/weakref/proxy.rs +++ b/src/types/weakref/proxy.rs @@ -190,6 +190,7 @@ impl<'py> PyWeakrefMethods<'py> for Bound<'py, PyWeakrefProxy> { #[cfg(test)] mod tests { use crate::exceptions::{PyAttributeError, PyReferenceError, PyTypeError}; + use crate::platform::prelude::*; use crate::types::any::{PyAny, PyAnyMethods}; use crate::types::weakref::{PyWeakrefMethods, PyWeakrefProxy}; use crate::{Bound, PyResult, Python}; diff --git a/src/types/weakref/reference.rs b/src/types/weakref/reference.rs index 13f1f6ecd0b..44a3adbc325 100644 --- a/src/types/weakref/reference.rs +++ b/src/types/weakref/reference.rs @@ -197,6 +197,7 @@ impl<'py> PyWeakrefMethods<'py> for Bound<'py, PyWeakrefReference> { #[cfg(test)] mod tests { + use crate::platform::prelude::*; use crate::types::any::{PyAny, PyAnyMethods}; use crate::types::weakref::{PyWeakrefMethods, PyWeakrefReference}; use crate::{Bound, PyResult, Python}; diff --git a/tests/test_utils/mod.rs b/tests/test_utils/mod.rs index 6f792490231..5a4605cbb07 100644 --- a/tests/test_utils/mod.rs +++ b/tests/test_utils/mod.rs @@ -7,6 +7,8 @@ // the inner mod enables the #![allow(dead_code)] to // be applied - `src/test_utils.rs` uses `include!` to pull in this file +extern crate alloc; + #[allow( dead_code, unused_macros, @@ -24,6 +26,8 @@ mod inner { use pyo3::prelude::*; + use alloc::string::ToString; + #[cfg(any(not(all(Py_GIL_DISABLED, Py_3_14)), feature = "macros"))] use pyo3::sync::MutexExt; use pyo3::types::{IntoPyDict, PyList}; diff --git a/tests/ui/invalid_pyfunction_argument.inspect.stderr b/tests/ui/invalid_pyfunction_argument.inspect.stderr index 24a98721a4a..bbfc9d2af19 100644 --- a/tests/ui/invalid_pyfunction_argument.inspect.stderr +++ b/tests/ui/invalid_pyfunction_argument.inspect.stderr @@ -75,9 +75,9 @@ help: the following other types implement trait `pyo3::PyClass` 17 | #[pyclass(skip_from_py_object)] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `Foo` | - ::: src/coroutine.rs:29:1 + ::: src/coroutine.rs:30:1 | - 29 | #[pyclass(crate = "crate")] + 30 | #[pyclass(crate = "crate")] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ `pyo3::coroutine::Coroutine` = note: required for `Atomic<*mut ()>` to implement `FromPyObject<'_, '_>` = note: required for `Atomic<*mut ()>` to implement `pyo3::impl_::extract_argument::PyFunctionArgument<'_, '_, '_, true>`