#[repr(transparent)]pub struct PyWeakrefProxy(PyAny);Expand description
Represents any Python weakref Proxy type.
In Python this is created by calling weakref.proxy.
This is either a weakref.ProxyType or a weakref.CallableProxyType (weakref.ProxyTypes).
Tuple Fields§
§0: PyAnyImplementations§
Source§impl PyWeakrefProxy
TODO: UPDATE DOCS
 
impl PyWeakrefProxy
TODO: UPDATE DOCS
Sourcepub fn new<'py>(
    object: &Bound<'py, PyAny>,
) -> PyResult<Bound<'py, PyWeakrefProxy>>
 
pub fn new<'py>( object: &Bound<'py, PyAny>, ) -> PyResult<Bound<'py, PyWeakrefProxy>>
Constructs a new Weak Reference (weakref.proxy/weakref.ProxyType/weakref.CallableProxyType) 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::PyWeakrefProxy;
#[pyclass(weakref)]
struct Foo { /* fields omitted */ }
Python::with_gil(|py| {
    let foo = Bound::new(py, Foo {})?;
    let weakref = PyWeakrefProxy::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 = PyWeakrefProxy::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, PyWeakrefProxy>>where
    C: IntoPyObject<'py>,
 
pub fn new_with<'py, C>(
    object: &Bound<'py, PyAny>,
    callback: C,
) -> PyResult<Bound<'py, PyWeakrefProxy>>where
    C: IntoPyObject<'py>,
Constructs a new Weak Reference (weakref.proxy/weakref.ProxyType/weakref.CallableProxyType) 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::PyWeakrefProxy;
use pyo3::ffi::c_str;
#[pyclass(weakref)]
struct Foo { /* fields omitted */ }
#[pyfunction]
fn callback(wref: Bound<'_, PyWeakrefProxy>) -> 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 = PyWeakrefProxy::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 = PyWeakrefProxy::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 PyTypeCheck for PyWeakrefProxy
 
impl PyTypeCheck for PyWeakrefProxy
impl DerefToPyAny for PyWeakrefProxy
Auto Trait Implementations§
impl !Freeze for PyWeakrefProxy
impl !RefUnwindSafe for PyWeakrefProxy
impl !Send for PyWeakrefProxy
impl !Sync for PyWeakrefProxy
impl Unpin for PyWeakrefProxy
impl UnwindSafe for PyWeakrefProxy
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> 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