#[repr(transparent)]pub struct PyWeakrefReference(PyAny);Expand description
Represents a Python weakref.ReferenceType.
In Python this is created by calling weakref.ref.
Tuple Fields§
§0: PyAnyImplementations§
Source§impl PyWeakrefReference
 
impl PyWeakrefReference
#[doc(hidden)] pub const _PYO3_DEF: AddTypeToModule<Self>
#[doc(hidden)] pub const _PYO3_INTROSPECTION_ID: &'static str = "Some(\"weakref\")PyWeakrefReference"
Source§impl PyWeakrefReference
 
impl PyWeakrefReference
Sourcepub fn new<'py>(
    object: &Bound<'py, PyAny>,
) -> PyResult<Bound<'py, PyWeakrefReference>>
 
pub fn new<'py>( object: &Bound<'py, PyAny>, ) -> PyResult<Bound<'py, PyWeakrefReference>>
Constructs a new Weak Reference (weakref.ref/weakref.ReferenceType) for the given object.
Returns a TypeError if object is not weak referenceable (Most native types and PyClasses without weakref flag).
§Examples
use pyo3::prelude::*;
use pyo3::types::PyWeakrefReference;
#[pyclass(weakref)]
struct Foo { /* fields omitted */ }
Python::with_gil(|py| {
    let foo = Bound::new(py, Foo {})?;
    let weakref = PyWeakrefReference::new(&foo)?;
    assert!(
        // In normal situations where a direct `Bound<'py, Foo>` is required use `upgrade::<Foo>`
        weakref.upgrade()
            .map_or(false, |obj| obj.is(&foo))
    );
    let weakref2 = PyWeakrefReference::new(&foo)?;
    assert!(weakref.is(&weakref2));
    drop(foo);
    assert!(weakref.upgrade().is_none());
    Ok(())
})Sourcepub fn new_with<'py, C>(
    object: &Bound<'py, PyAny>,
    callback: C,
) -> PyResult<Bound<'py, PyWeakrefReference>>where
    C: IntoPyObject<'py>,
 
pub fn new_with<'py, C>(
    object: &Bound<'py, PyAny>,
    callback: C,
) -> PyResult<Bound<'py, PyWeakrefReference>>where
    C: IntoPyObject<'py>,
Constructs a new Weak Reference (weakref.ref/weakref.ReferenceType) for the given object with a callback.
Returns a TypeError if object is not weak referenceable (Most native types and PyClasses without weakref flag) or if the callback is not callable or None.
§Examples
use pyo3::prelude::*;
use pyo3::types::PyWeakrefReference;
use pyo3::ffi::c_str;
#[pyclass(weakref)]
struct Foo { /* fields omitted */ }
#[pyfunction]
fn callback(wref: Bound<'_, PyWeakrefReference>) -> PyResult<()> {
        let py = wref.py();
        assert!(wref.upgrade_as::<Foo>()?.is_none());
        py.run(c_str!("counter = 1"), None, None)
}
Python::with_gil(|py| {
    py.run(c_str!("counter = 0"), None, None)?;
    assert_eq!(py.eval(c_str!("counter"), None, None)?.extract::<u32>()?, 0);
    let foo = Bound::new(py, Foo{})?;
    // This is fine.
    let weakref = PyWeakrefReference::new_with(&foo, py.None())?;
    assert!(weakref.upgrade_as::<Foo>()?.is_some());
    assert!(
        // In normal situations where a direct `Bound<'py, Foo>` is required use `upgrade::<Foo>`
        weakref.upgrade()
            .map_or(false, |obj| obj.is(&foo))
    );
    assert_eq!(py.eval(c_str!("counter"), None, None)?.extract::<u32>()?, 0);
    let weakref2 = PyWeakrefReference::new_with(&foo, wrap_pyfunction!(callback, py)?)?;
    assert!(!weakref.is(&weakref2)); // Not the same weakref
    assert!(weakref.eq(&weakref2)?);  // But Equal, since they point to the same object
    drop(foo);
    assert!(weakref.upgrade_as::<Foo>()?.is_none());
    assert_eq!(py.eval(c_str!("counter"), None, None)?.extract::<u32>()?, 1);
    Ok(())
})Trait Implementations§
Source§impl PyClassBaseType for PyWeakrefReference
Available on non-Py_LIMITED_API only. 
impl PyClassBaseType for PyWeakrefReference
Available on non-
Py_LIMITED_API only.Source§impl PyTypeInfo for PyWeakrefReference
 
impl PyTypeInfo for PyWeakrefReference
Source§fn type_object_raw(py: Python<'_>) -> *mut PyTypeObject
 
fn type_object_raw(py: Python<'_>) -> *mut PyTypeObject
Returns the PyTypeObject instance for this type.
Source§fn is_type_of(obj: &Bound<'_, PyAny>) -> bool
 
fn is_type_of(obj: &Bound<'_, PyAny>) -> bool
Checks if 
object is an instance of this type or a subclass of this type.impl DerefToPyAny for PyWeakrefReference
impl PyLayout<PyWeakrefReference> for PyWeakReference
impl PySizedLayout<PyWeakrefReference> for PyWeakReference
Auto Trait Implementations§
impl !Freeze for PyWeakrefReference
impl !RefUnwindSafe for PyWeakrefReference
impl !Send for PyWeakrefReference
impl !Sync for PyWeakrefReference
impl Unpin for PyWeakrefReference
impl UnwindSafe for PyWeakrefReference
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
Mutably borrows from an owned value. Read more
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>
Converts 
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>
Converts 
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 = _
🔬This is a nightly-only experimental API. (
sized_type_properties)Source§#[doc(hidden)] const LAYOUT: Layout = _
 
#[doc(hidden)] const LAYOUT: Layout = _
🔬This is a nightly-only experimental API. (
sized_type_properties)Source§#[doc(hidden)] const MAX_SLICE_LEN: usize = _
 
#[doc(hidden)] const MAX_SLICE_LEN: usize = _
🔬This is a nightly-only experimental API. (
sized_type_properties)The largest safe length for a 
[Self]. Read more