[−][src]Struct pyo3::pycell::PyCell
PyCell
is the container type for PyClass
.
From Python side, PyCell<T>
is the concrete layout of T: PyClass
in the Python heap,
which means we can convert *const PyClass<T>
to *mut ffi::PyObject
.
From Rust side, PyCell<T>
is the mutable container of T
.
Since PyCell<T: PyClass>
is always on the Python heap, we don't have the ownership of it.
Thus, to mutate the data behind &PyCell<T>
safely, we employ the
Interior Mutability Pattern
like std::cell::RefCell.
Examples
In most cases, PyCell
is hidden behind #[pymethods]
.
However, you can construct &PyCell
directly to test your pyclass in Rust code.
#[pyclass] struct Book { #[pyo3(get)] name: &'static str, author: &'static str, } let gil = Python::acquire_gil(); let py = gil.python(); let book = Book { name: "The Man in the High Castle", author: "Philip Kindred Dick", }; let book_cell = PyCell::new(py, book).unwrap(); // you can expose PyCell to Python snippets pyo3::py_run!(py, book_cell, "assert book_cell.name[-6:] == 'Castle'");
You can use slf: &PyCell<Self>
as an alternative self
receiver of #[pymethod]
,
though you rarely need it.
use std::collections::HashMap; #[pyclass] #[derive(Default)] struct Counter { counter: HashMap<String, usize> } #[pymethods] impl Counter { // You can use &mut self here, but now we use &PyCell for demonstration fn increment(slf: &PyCell<Self>, name: String) -> PyResult<usize> { let mut slf_mut = slf.try_borrow_mut()?; // Now a mutable reference exists so we cannot get another one assert!(slf.try_borrow().is_err()); assert!(slf.try_borrow_mut().is_err()); let counter = slf_mut.counter.entry(name).or_insert(0); *counter += 1; Ok(*counter) } }
Implementations
impl<T: PyClass> PyCell<T>
[src]
pub fn new(
py: Python,
value: impl Into<PyClassInitializer<T>>
) -> PyResult<&Self> where
T::BaseLayout: PyBorrowFlagLayout<T::BaseType>,
[src]
py: Python,
value: impl Into<PyClassInitializer<T>>
) -> PyResult<&Self> where
T::BaseLayout: PyBorrowFlagLayout<T::BaseType>,
Make new PyCell
on the Python heap and returns the reference of it.
pub fn borrow(&self) -> PyRef<T>
[src]
Immutably borrows the value T
. This borrow lasts untill the returned PyRef
exists.
Panics
Panics if the value is currently mutably borrowed. For a non-panicking variant, use
try_borrow
.
pub fn borrow_mut(&self) -> PyRefMut<T>
[src]
Mutably borrows the value T
. This borrow lasts untill the returned PyRefMut
exists.
Panics
Panics if the value is currently mutably borrowed. For a non-panicking variant, use
try_borrow_mut
.
pub fn try_borrow(&self) -> Result<PyRef<T>, PyBorrowError>
[src]
Immutably borrows the value T
, returning an error if the value is currently
mutably borrowed. This borrow lasts untill the returned PyRef
exists.
This is the non-panicking variant of borrow
.
Examples
#[pyclass] struct Class {} let gil = Python::acquire_gil(); let py = gil.python(); let c = PyCell::new(py, Class {}).unwrap(); { let m = c.borrow_mut(); assert!(c.try_borrow().is_err()); } { let m = c.borrow(); assert!(c.try_borrow().is_ok()); }
pub fn try_borrow_mut(&self) -> Result<PyRefMut<T>, PyBorrowMutError>
[src]
Mutably borrows the value T
, returning an error if the value is currently borrowed.
This borrow lasts untill the returned PyRefMut
exists.
This is the non-panicking variant of borrow_mut
.
Examples
#[pyclass] struct Class {} let gil = Python::acquire_gil(); let py = gil.python(); let c = PyCell::new(py, Class {}).unwrap(); { let m = c.borrow(); assert!(c.try_borrow_mut().is_err()); } assert!(c.try_borrow_mut().is_ok());
pub unsafe fn try_borrow_unguarded(&self) -> Result<&T, PyBorrowError>
[src]
Immutably borrows the value T
, returning an error if the value is
currently mutably borrowed.
Safety
This method is unsafe because it does not return a PyRef
,
thus leaving the borrow flag untouched. Mutably borrowing the PyCell
while the reference returned by this method is alive is undefined behaviour.
Examples
#[pyclass] struct Class {} let gil = Python::acquire_gil(); let py = gil.python(); let c = PyCell::new(py, Class {}).unwrap(); { let m = c.borrow_mut(); assert!(unsafe { c.try_borrow_unguarded() }.is_err()); } { let m = c.borrow(); assert!(unsafe { c.try_borrow_unguarded() }.is_ok()); }
pub fn replace(&self, t: T) -> T
[src]
Replaces the wrapped value with a new one, returning the old value,
Panics
Panics if the value is currently borrowed.
pub fn replace_with<F: FnOnce(&mut T) -> T>(&self, f: F) -> T
[src]
Replaces the wrapped value with a new one computed from f
, returning the old value.
Panics
Panics if the value is currently borrowed.
pub fn swap(&self, other: &Self)
[src]
Swaps the wrapped value of self
with the wrapped value of other
.
Panics
Panics if the value in either PyCell
is currently borrowed.
Trait Implementations
impl<T: PyClass> AsPyPointer for PyCell<T>
[src]
impl<T: PyClass + Debug> Debug for PyCell<T>
[src]
impl<'a, '_, T> From<&'_ PyCell<T>> for Py<T> where
T: PyClass,
[src]
T: PyClass,
impl<'a, T> FromPyObject<'a> for &'a PyCell<T> where
T: PyClass,
[src]
T: PyClass,
impl<'p, T> FromPyPointer<'p> for PyCell<T> where
T: PyClass,
[src]
T: PyClass,
unsafe fn from_owned_ptr_or_opt(
py: Python<'p>,
ptr: *mut PyObject
) -> Option<&'p Self>
[src]
py: Python<'p>,
ptr: *mut PyObject
) -> Option<&'p Self>
unsafe fn from_borrowed_ptr_or_opt(
py: Python<'p>,
ptr: *mut PyObject
) -> Option<&'p Self>
[src]
py: Python<'p>,
ptr: *mut PyObject
) -> Option<&'p Self>
unsafe fn from_owned_ptr_or_panic(
py: Python<'p>,
ptr: *mut PyObject
) -> &'p Self
[src]
py: Python<'p>,
ptr: *mut PyObject
) -> &'p Self
unsafe fn from_owned_ptr(py: Python<'p>, ptr: *mut PyObject) -> &'p Self
[src]
unsafe fn from_owned_ptr_or_err(
py: Python<'p>,
ptr: *mut PyObject
) -> PyResult<&'p Self>
[src]
py: Python<'p>,
ptr: *mut PyObject
) -> PyResult<&'p Self>
unsafe fn from_borrowed_ptr_or_panic(
py: Python<'p>,
ptr: *mut PyObject
) -> &'p Self
[src]
py: Python<'p>,
ptr: *mut PyObject
) -> &'p Self
unsafe fn from_borrowed_ptr(py: Python<'p>, ptr: *mut PyObject) -> &'p Self
[src]
unsafe fn from_borrowed_ptr_or_err(
py: Python<'p>,
ptr: *mut PyObject
) -> PyResult<&'p Self>
[src]
py: Python<'p>,
ptr: *mut PyObject
) -> PyResult<&'p Self>
impl<T: PyClass> PyDowncastImpl for PyCell<T>
[src]
unsafe fn unchecked_downcast(obj: &PyAny) -> &Self
[src]
fn __private__(&self) -> PrivateMarker
[src]
impl<T: PyClass> PyLayout<T> for PyCell<T>
[src]
const IS_NATIVE_TYPE: bool
[src]
fn get_super(&mut self) -> Option<&mut T::BaseLayout>
[src]
unsafe fn py_init(&mut self, value: T)
[src]
unsafe fn py_drop(&mut self, py: Python)
[src]
impl<'v, T> PyTryFrom<'v> for PyCell<T> where
T: 'v + PyClass,
[src]
T: 'v + PyClass,
fn try_from<V: Into<&'v PyAny>>(value: V) -> Result<&'v Self, PyDowncastError>
[src]
fn try_from_exact<V: Into<&'v PyAny>>(
value: V
) -> Result<&'v Self, PyDowncastError>
[src]
value: V
) -> Result<&'v Self, PyDowncastError>
unsafe fn try_from_unchecked<V: Into<&'v PyAny>>(value: V) -> &'v Self
[src]
impl<'_, T: PyClass> ToPyObject for &'_ PyCell<T>
[src]
impl<'a, T: PyClass> TryFrom<&'a PyCell<T>> for PyRef<'a, T>
[src]
type Error = PyBorrowError
The type returned in the event of a conversion error.
fn try_from(cell: &'a PyCell<T>) -> Result<Self, Self::Error>
[src]
impl<'a, T: PyClass> TryFrom<&'a PyCell<T>> for PyRefMut<'a, T>
[src]
Auto Trait Implementations
impl<T> !RefUnwindSafe for PyCell<T>
impl<T> Send for PyCell<T> where
T: Send,
<T as PyTypeInfo>::BaseLayout: Send,
<T as PyClass>::Dict: Send,
<T as PyClass>::WeakRef: Send,
T: Send,
<T as PyTypeInfo>::BaseLayout: Send,
<T as PyClass>::Dict: Send,
<T as PyClass>::WeakRef: Send,
impl<T> !Sync for PyCell<T>
impl<T> Unpin for PyCell<T> where
T: Unpin,
<T as PyTypeInfo>::BaseLayout: Unpin,
<T as PyClass>::Dict: Unpin,
<T as PyClass>::WeakRef: Unpin,
T: Unpin,
<T as PyTypeInfo>::BaseLayout: Unpin,
<T as PyClass>::Dict: Unpin,
<T as PyClass>::WeakRef: Unpin,
impl<T> UnwindSafe for PyCell<T> where
T: UnwindSafe,
<T as PyTypeInfo>::BaseLayout: UnwindSafe,
<T as PyClass>::Dict: UnwindSafe,
<T as PyClass>::WeakRef: UnwindSafe,
T: UnwindSafe,
<T as PyTypeInfo>::BaseLayout: UnwindSafe,
<T as PyClass>::Dict: UnwindSafe,
<T as PyClass>::WeakRef: UnwindSafe,
Blanket Implementations
impl<T> Any for T where
T: 'static + ?Sized,
[src]
T: 'static + ?Sized,
impl<T> Borrow<T> for T where
T: ?Sized,
[src]
T: ?Sized,
impl<T> BorrowMut<T> for T where
T: ?Sized,
[src]
T: ?Sized,
fn borrow_mut(&mut self) -> &mut T
[src]
impl<T> From<T> for T
[src]
impl<T> FromPy<T> for T
[src]
impl<'p, T> FromPyPointer<'p> for T where
T: 'p + PyNativeType,
[src]
T: 'p + PyNativeType,
unsafe fn from_owned_ptr_or_opt(Python<'p>, *mut PyObject) -> Option<&'p T>
[src]
unsafe fn from_borrowed_ptr_or_opt(Python<'p>, *mut PyObject) -> Option<&'p T>
[src]
unsafe fn from_owned_ptr_or_panic(
py: Python<'p>,
ptr: *mut PyObject
) -> &'p Self
[src]
py: Python<'p>,
ptr: *mut PyObject
) -> &'p Self
unsafe fn from_owned_ptr(py: Python<'p>, ptr: *mut PyObject) -> &'p Self
[src]
unsafe fn from_owned_ptr_or_err(
py: Python<'p>,
ptr: *mut PyObject
) -> PyResult<&'p Self>
[src]
py: Python<'p>,
ptr: *mut PyObject
) -> PyResult<&'p Self>
unsafe fn from_borrowed_ptr_or_panic(
py: Python<'p>,
ptr: *mut PyObject
) -> &'p Self
[src]
py: Python<'p>,
ptr: *mut PyObject
) -> &'p Self
unsafe fn from_borrowed_ptr(py: Python<'p>, ptr: *mut PyObject) -> &'p Self
[src]
unsafe fn from_borrowed_ptr_or_err(
py: Python<'p>,
ptr: *mut PyObject
) -> PyResult<&'p Self>
[src]
py: Python<'p>,
ptr: *mut PyObject
) -> PyResult<&'p Self>
impl<T, U> Into<U> for T where
U: From<T>,
[src]
U: From<T>,
impl<T, U> IntoPy<U> for T where
U: FromPy<T>,
[src]
U: FromPy<T>,
impl<'py, T> PyDowncastImpl for T where
T: 'py + PyNativeType,
[src]
T: 'py + PyNativeType,
unsafe fn unchecked_downcast(&PyAny) -> &T
[src]
fn __private__(&self) -> PrivateMarker
[src]
impl<'v, T> PyTryFrom<'v> for T where
T: PyDowncastImpl + PyTypeInfo + PyNativeType,
[src]
T: PyDowncastImpl + PyTypeInfo + PyNativeType,
fn try_from<V>(V) -> Result<&'v T, PyDowncastError> where
V: Into<&'v PyAny>,
[src]
V: Into<&'v PyAny>,
fn try_from_exact<V>(V) -> Result<&'v T, PyDowncastError> where
V: Into<&'v PyAny>,
[src]
V: Into<&'v PyAny>,
unsafe fn try_from_unchecked<V>(V) -> &'v T where
V: Into<&'v PyAny>,
[src]
V: Into<&'v PyAny>,
impl<T, U> TryFrom<U> for T where
U: Into<T>,
[src]
U: Into<T>,
type Error = Infallible
The type returned in the event of a conversion error.
fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>
[src]
impl<T, U> TryInto<U> for T where
U: TryFrom<T>,
[src]
U: TryFrom<T>,