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_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 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(obj: &Bound<'_, PyAny>) -> bool
fn is_type_of(obj: &Bound<'_, PyAny>) -> bool
object
is an instance of this type or a subclass of this type.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