pub struct PyCapsule(/* private fields */);
Expand description
Represents a Python Capsule as described in Capsules:
This subtype of PyObject represents an opaque value, useful for C extension modules who need to pass an opaque value (as a void* pointer) through Python code to other C code. It is often used to make a C function pointer defined in one module available to other modules, so the regular import mechanism can be used to access C APIs defined in dynamically loaded modules.
Values of this type are accessed via PyO3’s smart pointers, e.g. as
Py<PyCapsule>
or Bound<'py, PyCapsule>
.
For APIs available on capsule objects, see the PyCapsuleMethods
trait which is implemented for
Bound<'py, PyCapsule>
.
§Example
use pyo3::{prelude::*, types::PyCapsule};
use std::ffi::CString;
#[repr(C)]
struct Foo {
pub val: u32,
}
let r = Python::with_gil(|py| -> PyResult<()> {
let foo = Foo { val: 123 };
let name = CString::new("builtins.capsule").unwrap();
let capsule = PyCapsule::new(py, foo, Some(name.clone()))?;
let module = PyModule::import(py, "builtins")?;
module.add("capsule", capsule)?;
let cap: &Foo = unsafe { PyCapsule::import(py, name.as_ref())? };
assert_eq!(cap.val, 123);
Ok(())
});
assert!(r.is_ok());
Implementations§
Source§impl PyCapsule
impl PyCapsule
Sourcepub fn new<T: 'static + Send + AssertNotZeroSized>(
py: Python<'_>,
value: T,
name: Option<CString>,
) -> PyResult<Bound<'_, Self>>
pub fn new<T: 'static + Send + AssertNotZeroSized>( py: Python<'_>, value: T, name: Option<CString>, ) -> PyResult<Bound<'_, Self>>
Constructs a new capsule whose contents are value
, associated with name
.
name
is the identifier for the capsule; if it is stored as an attribute of a module,
the name should be in the format "modulename.attribute"
.
It is checked at compile time that the type T is not zero-sized. Rust function items
need to be cast to a function pointer (fn(args) -> result
) to be put into a capsule.
§Example
use pyo3::{prelude::*, types::PyCapsule};
use std::ffi::CString;
Python::with_gil(|py| {
let name = CString::new("foo").unwrap();
let capsule = PyCapsule::new(py, 123_u32, Some(name)).unwrap();
let val = unsafe { capsule.reference::<u32>() };
assert_eq!(*val, 123);
});
However, attempting to construct a PyCapsule
with a zero-sized type will not compile:
use pyo3::{prelude::*, types::PyCapsule};
use std::ffi::CString;
Python::with_gil(|py| {
let capsule = PyCapsule::new(py, (), None).unwrap(); // Oops! `()` is zero sized!
});
Sourcepub fn new_bound<T: 'static + Send + AssertNotZeroSized>(
py: Python<'_>,
value: T,
name: Option<CString>,
) -> PyResult<Bound<'_, Self>>
👎Deprecated since 0.23.0: renamed to PyCapsule::new
pub fn new_bound<T: 'static + Send + AssertNotZeroSized>( py: Python<'_>, value: T, name: Option<CString>, ) -> PyResult<Bound<'_, Self>>
PyCapsule::new
Deprecated name for PyCapsule::new
.
Sourcepub fn new_with_destructor<T: 'static + Send + AssertNotZeroSized, F: FnOnce(T, *mut c_void) + Send>(
py: Python<'_>,
value: T,
name: Option<CString>,
destructor: F,
) -> PyResult<Bound<'_, Self>>
pub fn new_with_destructor<T: 'static + Send + AssertNotZeroSized, F: FnOnce(T, *mut c_void) + Send>( py: Python<'_>, value: T, name: Option<CString>, destructor: F, ) -> PyResult<Bound<'_, Self>>
Constructs a new capsule whose contents are value
, associated with name
.
Also provides a destructor: when the PyCapsule
is destroyed, it will be passed the original object,
as well as a *mut c_void
which will point to the capsule’s context, if any.
The destructor
must be Send
, because there is no guarantee which thread it will eventually
be called from.
Sourcepub fn new_bound_with_destructor<T: 'static + Send + AssertNotZeroSized, F: FnOnce(T, *mut c_void) + Send>(
py: Python<'_>,
value: T,
name: Option<CString>,
destructor: F,
) -> PyResult<Bound<'_, Self>>
👎Deprecated since 0.23.0: renamed to PyCapsule::new_with_destructor
pub fn new_bound_with_destructor<T: 'static + Send + AssertNotZeroSized, F: FnOnce(T, *mut c_void) + Send>( py: Python<'_>, value: T, name: Option<CString>, destructor: F, ) -> PyResult<Bound<'_, Self>>
PyCapsule::new_with_destructor
Deprecated name for PyCapsule::new_with_destructor
.
Sourcepub unsafe fn import<'py, T>(py: Python<'py>, name: &CStr) -> PyResult<&'py T>
pub unsafe fn import<'py, T>(py: Python<'py>, name: &CStr) -> PyResult<&'py T>
Imports an existing capsule.
The name
should match the path to the module attribute exactly in the form
of "module.attribute"
, which should be the same as the name within the capsule.
§Safety
It must be known that the capsule imported by name
contains an item of type T
.
Trait Implementations§
Source§impl PyTypeInfo for PyCapsule
impl PyTypeInfo for PyCapsule
Source§fn type_object_raw(py: Python<'_>) -> *mut PyTypeObject
fn type_object_raw(py: Python<'_>) -> *mut PyTypeObject
Source§fn is_type_of_bound(obj: &Bound<'_, PyAny>) -> bool
fn is_type_of_bound(obj: &Bound<'_, PyAny>) -> bool
PyTypeInfo::is_type_of
PyTypeInfo::is_type_of
.Source§fn type_object(py: Python<'_>) -> Bound<'_, PyType>
fn type_object(py: Python<'_>) -> Bound<'_, PyType>
Source§fn type_object_bound(py: Python<'_>) -> Bound<'_, PyType>
fn type_object_bound(py: Python<'_>) -> Bound<'_, PyType>
PyTypeInfo::type_object
PyTypeInfo::type_object
.Source§fn is_type_of(object: &Bound<'_, PyAny>) -> bool
fn is_type_of(object: &Bound<'_, PyAny>) -> bool
object
is an instance of this type or a subclass of this type.Source§fn is_exact_type_of(object: &Bound<'_, PyAny>) -> bool
fn is_exact_type_of(object: &Bound<'_, PyAny>) -> bool
object
is an instance of this type.Source§fn is_exact_type_of_bound(object: &Bound<'_, PyAny>) -> bool
fn is_exact_type_of_bound(object: &Bound<'_, PyAny>) -> bool
PyTypeInfo::is_exact_type_of
PyTypeInfo::is_exact_type_of
.impl DerefToPyAny for PyCapsule
Auto Trait Implementations§
impl !Freeze for PyCapsule
impl !RefUnwindSafe for PyCapsule
impl !Send for PyCapsule
impl !Sync for PyCapsule
impl Unpin for PyCapsule
impl UnwindSafe for PyCapsule
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read more