#[repr(transparent)]pub struct PyCapsule(PyAny);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());Tuple Fields§
§0: PyAnyImplementations§
Source§impl PyCapsule
 
impl PyCapsule
#[doc(hidden)] pub const _PYO3_DEF: AddTypeToModule<Self>
#[doc(hidden)] pub const _PYO3_INTROSPECTION_ID: &'static str = ":: std :: option :: Option :: Some(\"builtins\")PyCapsule"
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> AssertNotZeroSized for T
 
impl<T> AssertNotZeroSized for T
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 moreSource§impl<T> PyTypeCheck for Twhere
    T: PyTypeInfo,
 
impl<T> PyTypeCheck for Twhere
    T: PyTypeInfo,
Source§impl<T> SizedTypeProperties for T
 
impl<T> SizedTypeProperties for T
Source§#[doc(hidden)] const IS_ZST: bool = _
 
#[doc(hidden)] const IS_ZST: bool = _
sized_type_properties)Source§#[doc(hidden)] const LAYOUT: Layout = _
 
#[doc(hidden)] const LAYOUT: Layout = _
sized_type_properties)Source§#[doc(hidden)] const MAX_SLICE_LEN: usize = _
 
#[doc(hidden)] const MAX_SLICE_LEN: usize = _
sized_type_properties)[Self]. Read more