pub struct PyWeakrefProxy(/* private fields */);
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
).
Implementations§
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_bound<'py>(
object: &Bound<'py, PyAny>,
) -> PyResult<Bound<'py, PyWeakrefProxy>>
👎Deprecated since 0.23.0: renamed to PyWeakrefProxy::new
pub fn new_bound<'py>( object: &Bound<'py, PyAny>, ) -> PyResult<Bound<'py, PyWeakrefProxy>>
PyWeakrefProxy::new
Deprecated name for PyWeakrefProxy::new
.
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(())
})
Sourcepub fn new_bound_with<'py, C>(
object: &Bound<'py, PyAny>,
callback: C,
) -> PyResult<Bound<'py, PyWeakrefProxy>>where
C: ToPyObject,
👎Deprecated since 0.23.0: renamed to PyWeakrefProxy::new_with
pub fn new_bound_with<'py, C>(
object: &Bound<'py, PyAny>,
callback: C,
) -> PyResult<Bound<'py, PyWeakrefProxy>>where
C: ToPyObject,
PyWeakrefProxy::new_with
Deprecated name for PyWeakrefProxy::new_with
.