diff --git a/newsfragments/5641.changed.md b/newsfragments/5641.changed.md new file mode 100644 index 00000000000..680c7b73687 --- /dev/null +++ b/newsfragments/5641.changed.md @@ -0,0 +1 @@ +Introspection: add TYPE_HINT to PyTypeInfo manual implementations \ No newline at end of file diff --git a/src/types/ellipsis.rs b/src/types/ellipsis.rs index 523e13bbf9a..448d4d10176 100644 --- a/src/types/ellipsis.rs +++ b/src/types/ellipsis.rs @@ -1,3 +1,5 @@ +#[cfg(feature = "experimental-inspect")] +use crate::inspect::TypeHint; use crate::{ ffi, ffi_ptr_ext::FfiPtrExt, types::any::PyAnyMethods, Borrowed, Bound, PyAny, PyTypeInfo, Python, @@ -27,9 +29,11 @@ impl PyEllipsis { unsafe impl PyTypeInfo for PyEllipsis { const NAME: &'static str = "ellipsis"; - const MODULE: Option<&'static str> = None; + #[cfg(feature = "experimental-inspect")] + const TYPE_HINT: TypeHint = TypeHint::module_attr("types", "EllipsisType"); + fn type_object_raw(_py: Python<'_>) -> *mut ffi::PyTypeObject { unsafe { ffi::Py_TYPE(ffi::Py_Ellipsis()) } } diff --git a/src/types/mapping.rs b/src/types/mapping.rs index af5b26ba463..d23263259ca 100644 --- a/src/types/mapping.rs +++ b/src/types/mapping.rs @@ -1,6 +1,8 @@ use crate::conversion::IntoPyObject; use crate::err::PyResult; use crate::ffi_ptr_ext::FfiPtrExt; +#[cfg(feature = "experimental-inspect")] +use crate::inspect::TypeHint; use crate::instance::Bound; use crate::py_result_ext::PyResultExt; use crate::sync::PyOnceLock; @@ -25,6 +27,9 @@ unsafe impl PyTypeInfo for PyMapping { const NAME: &'static str = "Mapping"; const MODULE: Option<&'static str> = Some("collections.abc"); + #[cfg(feature = "experimental-inspect")] + const TYPE_HINT: TypeHint = TypeHint::module_attr("collections.abc", "Mapping"); + #[inline] #[allow(clippy::redundant_closure_call)] fn type_object_raw(py: Python<'_>) -> *mut ffi::PyTypeObject { diff --git a/src/types/none.rs b/src/types/none.rs index dc2a6b0123b..64527734547 100644 --- a/src/types/none.rs +++ b/src/types/none.rs @@ -1,4 +1,6 @@ use crate::ffi_ptr_ext::FfiPtrExt; +#[cfg(feature = "experimental-inspect")] +use crate::inspect::TypeHint; use crate::{ffi, types::any::PyAnyMethods, Borrowed, Bound, PyAny, PyTypeInfo, Python}; /// Represents the Python `None` object. @@ -25,9 +27,11 @@ impl PyNone { unsafe impl PyTypeInfo for PyNone { const NAME: &'static str = "NoneType"; - const MODULE: Option<&'static str> = None; + #[cfg(feature = "experimental-inspect")] + const TYPE_HINT: TypeHint = TypeHint::builtin("None"); + fn type_object_raw(_py: Python<'_>) -> *mut ffi::PyTypeObject { unsafe { ffi::Py_TYPE(ffi::Py_None()) } } diff --git a/src/types/notimplemented.rs b/src/types/notimplemented.rs index d89b2fa64a6..76039644592 100644 --- a/src/types/notimplemented.rs +++ b/src/types/notimplemented.rs @@ -1,3 +1,5 @@ +#[cfg(feature = "experimental-inspect")] +use crate::inspect::TypeHint; use crate::{ ffi, ffi_ptr_ext::FfiPtrExt, types::any::PyAnyMethods, Borrowed, Bound, PyAny, PyTypeInfo, Python, @@ -29,6 +31,9 @@ unsafe impl PyTypeInfo for PyNotImplemented { const NAME: &'static str = "NotImplementedType"; const MODULE: Option<&'static str> = None; + #[cfg(feature = "experimental-inspect")] + const TYPE_HINT: TypeHint = TypeHint::module_attr("types", "NotImplementedType"); + fn type_object_raw(_py: Python<'_>) -> *mut ffi::PyTypeObject { unsafe { ffi::Py_TYPE(ffi::Py_NotImplemented()) } } diff --git a/src/types/sequence.rs b/src/types/sequence.rs index f0a336044b5..753559d4a7f 100644 --- a/src/types/sequence.rs +++ b/src/types/sequence.rs @@ -1,5 +1,7 @@ use crate::err::{self, PyErr, PyResult}; use crate::ffi_ptr_ext::FfiPtrExt; +#[cfg(feature = "experimental-inspect")] +use crate::inspect::TypeHint; use crate::instance::Bound; use crate::internal_tricks::get_ssize_index; use crate::py_result_ext::PyResultExt; @@ -24,6 +26,9 @@ unsafe impl PyTypeInfo for PySequence { const NAME: &'static str = "Sequence"; const MODULE: Option<&'static str> = Some("collections.abc"); + #[cfg(feature = "experimental-inspect")] + const TYPE_HINT: TypeHint = TypeHint::module_attr("collections.abc", "Sequence"); + #[inline] fn type_object_raw(py: Python<'_>) -> *mut ffi::PyTypeObject { static TYPE: PyOnceLock> = PyOnceLock::new();