Struct pyo3::types::PyByteArray
source · pub struct PyByteArray(/* private fields */);
Expand description
Represents a Python bytearray
.
Values of this type are accessed via PyO3’s smart pointers, e.g. as
Py<PyByteArray>
or Bound<'py, PyByteArray>
.
For APIs available on bytearray
objects, see the PyByteArrayMethods
trait which is implemented for
Bound<'py, PyByteArray>
.
Implementations§
source§impl PyByteArray
impl PyByteArray
sourcepub fn new_bound<'py>(py: Python<'py>, src: &[u8]) -> Bound<'py, PyByteArray>
pub fn new_bound<'py>(py: Python<'py>, src: &[u8]) -> Bound<'py, PyByteArray>
Creates a new Python bytearray object.
The byte string is initialized by copying the data from the &[u8]
.
sourcepub fn new_bound_with<F>(
py: Python<'_>,
len: usize,
init: F,
) -> PyResult<Bound<'_, PyByteArray>>
pub fn new_bound_with<F>( py: Python<'_>, len: usize, init: F, ) -> PyResult<Bound<'_, PyByteArray>>
Creates a new Python bytearray
object with an init
closure to write its contents.
Before calling init
the bytearray is zero-initialised.
- If Python raises a MemoryError on the allocation,
new_with
will return it insideErr
. - If
init
returnsErr(e)
,new_with
will returnErr(e)
. - If
init
returnsOk(())
,new_with
will returnOk(&PyByteArray)
.
§Examples
use pyo3::{prelude::*, types::PyByteArray};
Python::with_gil(|py| -> PyResult<()> {
let py_bytearray = PyByteArray::new_bound_with(py, 10, |bytes: &mut [u8]| {
bytes.copy_from_slice(b"Hello Rust");
Ok(())
})?;
let bytearray: &[u8] = unsafe { py_bytearray.as_bytes() };
assert_eq!(bytearray, b"Hello Rust");
Ok(())
})
sourcepub fn from_bound<'py>(
src: &Bound<'py, PyAny>,
) -> PyResult<Bound<'py, PyByteArray>>
pub fn from_bound<'py>( src: &Bound<'py, PyAny>, ) -> PyResult<Bound<'py, PyByteArray>>
Creates a new Python bytearray
object from another Python object that
implements the buffer protocol.
source§impl PyByteArray
impl PyByteArray
sourcepub fn new<'py>(py: Python<'py>, src: &[u8]) -> &'py PyByteArray
👎Deprecated since 0.21.0: PyByteArray::new
will be replaced by PyByteArray::new_bound
in a future PyO3 versionAvailable on crate feature gil-refs
only.
pub fn new<'py>(py: Python<'py>, src: &[u8]) -> &'py PyByteArray
PyByteArray::new
will be replaced by PyByteArray::new_bound
in a future PyO3 versiongil-refs
only.Deprecated form of PyByteArray::new_bound
sourcepub fn new_with<F>(
py: Python<'_>,
len: usize,
init: F,
) -> PyResult<&PyByteArray>
👎Deprecated since 0.21.0: PyByteArray::new_with
will be replaced by PyByteArray::new_bound_with
in a future PyO3 versionAvailable on crate feature gil-refs
only.
pub fn new_with<F>( py: Python<'_>, len: usize, init: F, ) -> PyResult<&PyByteArray>
PyByteArray::new_with
will be replaced by PyByteArray::new_bound_with
in a future PyO3 versiongil-refs
only.Deprecated form of PyByteArray::new_bound_with
sourcepub fn from(src: &PyAny) -> PyResult<&PyByteArray>
👎Deprecated since 0.21.0: PyByteArray::from
will be replaced by PyByteArray::from_bound
in a future PyO3 versionAvailable on crate feature gil-refs
only.
pub fn from(src: &PyAny) -> PyResult<&PyByteArray>
PyByteArray::from
will be replaced by PyByteArray::from_bound
in a future PyO3 versiongil-refs
only.Deprecated form of PyByteArray::from_bound
sourcepub fn len(&self) -> usize
Available on crate feature gil-refs
only.
pub fn len(&self) -> usize
gil-refs
only.Gets the length of the bytearray.
sourcepub fn is_empty(&self) -> bool
Available on crate feature gil-refs
only.
pub fn is_empty(&self) -> bool
gil-refs
only.Checks if the bytearray is empty.
sourcepub fn data(&self) -> *mut u8
Available on crate feature gil-refs
only.
pub fn data(&self) -> *mut u8
gil-refs
only.Gets the start of the buffer containing the contents of the bytearray.
§Safety
See the safety requirements of PyByteArray::as_bytes
and PyByteArray::as_bytes_mut
.
sourcepub unsafe fn as_bytes(&self) -> &[u8] ⓘ
Available on crate feature gil-refs
only.
pub unsafe fn as_bytes(&self) -> &[u8] ⓘ
gil-refs
only.Extracts a slice of the ByteArray
’s entire buffer.
§Safety
Mutation of the bytearray
invalidates the slice. If it is used afterwards, the behavior is
undefined.
These mutations may occur in Python code as well as from Rust:
- Calling methods like
PyByteArray::as_bytes_mut
andPyByteArray::resize
will invalidate the slice. - Actions like dropping objects or raising exceptions can invoke
__del__
methods or signal handlers, which may execute arbitrary Python code. This means that if Python code has a reference to thebytearray
you cannot safely use the vast majority of PyO3’s API whilst using the slice.
As a result, this slice should only be used for short-lived operations without executing any Python code, such as copying into a Vec.
§Examples
use pyo3::prelude::*;
use pyo3::exceptions::PyRuntimeError;
use pyo3::types::PyByteArray;
#[pyfunction]
fn a_valid_function(bytes: &Bound<'_, PyByteArray>) -> PyResult<()> {
let section = {
// SAFETY: We promise to not let the interpreter regain control
// or invoke any PyO3 APIs while using the slice.
let slice = unsafe { bytes.as_bytes() };
// Copy only a section of `bytes` while avoiding
// `to_vec` which copies the entire thing.
let section = slice
.get(6..11)
.ok_or_else(|| PyRuntimeError::new_err("input is not long enough"))?;
Vec::from(section)
};
// Now we can do things with `section` and call PyO3 APIs again.
// ...
Ok(())
}
§Incorrect usage
The following bug
function is unsound ⚠️
#[pyfunction]
fn bug(py: Python<'_>, bytes: &Bound<'_, PyByteArray>) {
let slice = unsafe { bytes.as_bytes() };
// This explicitly yields control back to the Python interpreter...
// ...but it's not always this obvious. Many things do this implicitly.
py.allow_threads(|| {
// Python code could be mutating through its handle to `bytes`,
// which makes reading it a data race, which is undefined behavior.
println!("{:?}", slice[0]);
});
// Python code might have mutated it, so we can not rely on the slice
// remaining valid. As such this is also undefined behavior.
println!("{:?}", slice[0]);
}
sourcepub unsafe fn as_bytes_mut(&self) -> &mut [u8] ⓘ
Available on crate feature gil-refs
only.
pub unsafe fn as_bytes_mut(&self) -> &mut [u8] ⓘ
gil-refs
only.Extracts a mutable slice of the ByteArray
’s entire buffer.
§Safety
Any other accesses of the bytearray
’s buffer invalidate the slice. If it is used
afterwards, the behavior is undefined. The safety requirements of PyByteArray::as_bytes
apply to this function as well.
sourcepub fn to_vec(&self) -> Vec<u8> ⓘ
Available on crate feature gil-refs
only.
pub fn to_vec(&self) -> Vec<u8> ⓘ
gil-refs
only.Copies the contents of the bytearray to a Rust vector.
§Examples
let bytearray = PyByteArray::new_bound(py, b"Hello World.");
let mut copied_message = bytearray.to_vec();
assert_eq!(b"Hello World.", copied_message.as_slice());
copied_message[11] = b'!';
assert_eq!(b"Hello World!", copied_message.as_slice());
pyo3::py_run!(py, bytearray, "assert bytearray == b'Hello World.'");
sourcepub fn resize(&self, len: usize) -> PyResult<()>
Available on crate feature gil-refs
only.
pub fn resize(&self, len: usize) -> PyResult<()>
gil-refs
only.Resizes the bytearray object to the new length len
.
Note that this will invalidate any pointers obtained by PyByteArray::data, as well as any (unsafe) slices obtained from PyByteArray::as_bytes and PyByteArray::as_bytes_mut.
Methods from Deref<Target = PyAny>§
sourcepub fn is<T: AsPyPointer>(&self, other: &T) -> bool
Available on crate feature gil-refs
only.
pub fn is<T: AsPyPointer>(&self, other: &T) -> bool
gil-refs
only.Returns whether self
and other
point to the same object. To compare
the equality of two objects (the ==
operator), use eq
.
This is equivalent to the Python expression self is other
.
sourcepub fn hasattr<N>(&self, attr_name: N) -> PyResult<bool>
Available on crate feature gil-refs
only.
pub fn hasattr<N>(&self, attr_name: N) -> PyResult<bool>
gil-refs
only.Determines whether this object has the given attribute.
This is equivalent to the Python expression hasattr(self, attr_name)
.
To avoid repeated temporary allocations of Python strings, the intern!
macro can be used
to intern attr_name
.
§Example: intern!
ing the attribute name
#[pyfunction]
fn has_version(sys: &Bound<'_, PyModule>) -> PyResult<bool> {
sys.hasattr(intern!(sys.py(), "version"))
}
sourcepub fn getattr<N>(&self, attr_name: N) -> PyResult<&PyAny>
Available on crate feature gil-refs
only.
pub fn getattr<N>(&self, attr_name: N) -> PyResult<&PyAny>
gil-refs
only.Retrieves an attribute value.
This is equivalent to the Python expression self.attr_name
.
To avoid repeated temporary allocations of Python strings, the intern!
macro can be used
to intern attr_name
.
§Example: intern!
ing the attribute name
#[pyfunction]
fn version<'py>(sys: &Bound<'py, PyModule>) -> PyResult<Bound<'py, PyAny>> {
sys.getattr(intern!(sys.py(), "version"))
}
sourcepub fn setattr<N, V>(&self, attr_name: N, value: V) -> PyResult<()>
Available on crate feature gil-refs
only.
pub fn setattr<N, V>(&self, attr_name: N, value: V) -> PyResult<()>
gil-refs
only.Sets an attribute value.
This is equivalent to the Python expression self.attr_name = value
.
To avoid repeated temporary allocations of Python strings, the intern!
macro can be used
to intern name
.
§Example: intern!
ing the attribute name
#[pyfunction]
fn set_answer(ob: &Bound<'_, PyAny>) -> PyResult<()> {
ob.setattr(intern!(ob.py(), "answer"), 42)
}
sourcepub fn delattr<N>(&self, attr_name: N) -> PyResult<()>
Available on crate feature gil-refs
only.
pub fn delattr<N>(&self, attr_name: N) -> PyResult<()>
gil-refs
only.Deletes an attribute.
This is equivalent to the Python statement del self.attr_name
.
To avoid repeated temporary allocations of Python strings, the intern!
macro can be used
to intern attr_name
.
sourcepub fn compare<O>(&self, other: O) -> PyResult<Ordering>where
O: ToPyObject,
Available on crate feature gil-refs
only.
pub fn compare<O>(&self, other: O) -> PyResult<Ordering>where
O: ToPyObject,
gil-refs
only.Returns an Ordering
between self
and other
.
This is equivalent to the following Python code:
if self == other:
return Equal
elif a < b:
return Less
elif a > b:
return Greater
else:
raise TypeError("PyAny::compare(): All comparisons returned false")
§Examples
use pyo3::prelude::*;
use pyo3::types::PyFloat;
use std::cmp::Ordering;
Python::with_gil(|py| -> PyResult<()> {
let a = PyFloat::new_bound(py, 0_f64);
let b = PyFloat::new_bound(py, 42_f64);
assert_eq!(a.compare(b)?, Ordering::Less);
Ok(())
})?;
It will return PyErr
for values that cannot be compared:
use pyo3::prelude::*;
use pyo3::types::{PyFloat, PyString};
Python::with_gil(|py| -> PyResult<()> {
let a = PyFloat::new_bound(py, 0_f64);
let b = PyString::new_bound(py, "zero");
assert!(a.compare(b).is_err());
Ok(())
})?;
sourcepub fn rich_compare<O>(
&self,
other: O,
compare_op: CompareOp,
) -> PyResult<&PyAny>where
O: ToPyObject,
Available on crate feature gil-refs
only.
pub fn rich_compare<O>(
&self,
other: O,
compare_op: CompareOp,
) -> PyResult<&PyAny>where
O: ToPyObject,
gil-refs
only.Tests whether two Python objects obey a given CompareOp
.
lt
, le
, eq
, ne
,
gt
and ge
are the specialized versions
of this function.
Depending on the value of compare_op
, this is equivalent to one of the
following Python expressions:
compare_op | Python expression |
---|---|
CompareOp::Eq | self == other |
CompareOp::Ne | self != other |
CompareOp::Lt | self < other |
CompareOp::Le | self <= other |
CompareOp::Gt | self > other |
CompareOp::Ge | self >= other |
§Examples
use pyo3::class::basic::CompareOp;
use pyo3::prelude::*;
use pyo3::types::PyInt;
Python::with_gil(|py| -> PyResult<()> {
let a: Bound<'_, PyInt> = 0_u8.into_py(py).into_bound(py).downcast_into()?;
let b: Bound<'_, PyInt> = 42_u8.into_py(py).into_bound(py).downcast_into()?;
assert!(a.rich_compare(b, CompareOp::Le)?.is_truthy()?);
Ok(())
})?;
sourcepub fn lt<O>(&self, other: O) -> PyResult<bool>where
O: ToPyObject,
Available on crate feature gil-refs
only.
pub fn lt<O>(&self, other: O) -> PyResult<bool>where
O: ToPyObject,
gil-refs
only.Tests whether this object is less than another.
This is equivalent to the Python expression self < other
.
sourcepub fn le<O>(&self, other: O) -> PyResult<bool>where
O: ToPyObject,
Available on crate feature gil-refs
only.
pub fn le<O>(&self, other: O) -> PyResult<bool>where
O: ToPyObject,
gil-refs
only.Tests whether this object is less than or equal to another.
This is equivalent to the Python expression self <= other
.
sourcepub fn eq<O>(&self, other: O) -> PyResult<bool>where
O: ToPyObject,
Available on crate feature gil-refs
only.
pub fn eq<O>(&self, other: O) -> PyResult<bool>where
O: ToPyObject,
gil-refs
only.Tests whether this object is equal to another.
This is equivalent to the Python expression self == other
.
sourcepub fn ne<O>(&self, other: O) -> PyResult<bool>where
O: ToPyObject,
Available on crate feature gil-refs
only.
pub fn ne<O>(&self, other: O) -> PyResult<bool>where
O: ToPyObject,
gil-refs
only.Tests whether this object is not equal to another.
This is equivalent to the Python expression self != other
.
sourcepub fn gt<O>(&self, other: O) -> PyResult<bool>where
O: ToPyObject,
Available on crate feature gil-refs
only.
pub fn gt<O>(&self, other: O) -> PyResult<bool>where
O: ToPyObject,
gil-refs
only.Tests whether this object is greater than another.
This is equivalent to the Python expression self > other
.
sourcepub fn ge<O>(&self, other: O) -> PyResult<bool>where
O: ToPyObject,
Available on crate feature gil-refs
only.
pub fn ge<O>(&self, other: O) -> PyResult<bool>where
O: ToPyObject,
gil-refs
only.Tests whether this object is greater than or equal to another.
This is equivalent to the Python expression self >= other
.
sourcepub fn is_callable(&self) -> bool
Available on crate feature gil-refs
only.
pub fn is_callable(&self) -> bool
gil-refs
only.Determines whether this object appears callable.
This is equivalent to Python’s callable()
function.
§Examples
use pyo3::prelude::*;
Python::with_gil(|py| -> PyResult<()> {
let builtins = PyModule::import_bound(py, "builtins")?;
let print = builtins.getattr("print")?;
assert!(print.is_callable());
Ok(())
})?;
This is equivalent to the Python statement assert callable(print)
.
Note that unless an API needs to distinguish between callable and non-callable objects, there is no point in checking for callability. Instead, it is better to just do the call and handle potential exceptions.
sourcepub fn call(
&self,
args: impl IntoPy<Py<PyTuple>>,
kwargs: Option<&PyDict>,
) -> PyResult<&PyAny>
Available on crate feature gil-refs
only.
pub fn call( &self, args: impl IntoPy<Py<PyTuple>>, kwargs: Option<&PyDict>, ) -> PyResult<&PyAny>
gil-refs
only.Calls the object.
This is equivalent to the Python expression self(*args, **kwargs)
.
§Examples
use pyo3::prelude::*;
use pyo3::types::PyDict;
const CODE: &str = r#"
def function(*args, **kwargs):
assert args == ("hello",)
assert kwargs == {"cruel": "world"}
return "called with args and kwargs"
"#;
Python::with_gil(|py| {
let module = PyModule::from_code_bound(py, CODE, "", "")?;
let fun = module.getattr("function")?;
let args = ("hello",);
let kwargs = PyDict::new_bound(py);
kwargs.set_item("cruel", "world")?;
let result = fun.call(args, Some(&kwargs))?;
assert_eq!(result.extract::<String>()?, "called with args and kwargs");
Ok(())
})
sourcepub fn call0(&self) -> PyResult<&PyAny>
Available on crate feature gil-refs
only.
pub fn call0(&self) -> PyResult<&PyAny>
gil-refs
only.Calls the object without arguments.
This is equivalent to the Python expression self()
.
§Examples
use pyo3::prelude::*;
Python::with_gil(|py| -> PyResult<()> {
let module = PyModule::import_bound(py, "builtins")?;
let help = module.getattr("help")?;
help.call0()?;
Ok(())
})?;
This is equivalent to the Python expression help()
.
sourcepub fn call1(&self, args: impl IntoPy<Py<PyTuple>>) -> PyResult<&PyAny>
Available on crate feature gil-refs
only.
pub fn call1(&self, args: impl IntoPy<Py<PyTuple>>) -> PyResult<&PyAny>
gil-refs
only.Calls the object with only positional arguments.
This is equivalent to the Python expression self(*args)
.
§Examples
use pyo3::prelude::*;
const CODE: &str = r#"
def function(*args, **kwargs):
assert args == ("hello",)
assert kwargs == {}
return "called with args"
"#;
Python::with_gil(|py| {
let module = PyModule::from_code_bound(py, CODE, "", "")?;
let fun = module.getattr("function")?;
let args = ("hello",);
let result = fun.call1(args)?;
assert_eq!(result.extract::<String>()?, "called with args");
Ok(())
})
sourcepub fn call_method<N, A>(
&self,
name: N,
args: A,
kwargs: Option<&PyDict>,
) -> PyResult<&PyAny>
Available on crate feature gil-refs
only.
pub fn call_method<N, A>( &self, name: N, args: A, kwargs: Option<&PyDict>, ) -> PyResult<&PyAny>
gil-refs
only.Calls a method on the object.
This is equivalent to the Python expression self.name(*args, **kwargs)
.
To avoid repeated temporary allocations of Python strings, the intern!
macro can be used
to intern name
.
§Examples
use pyo3::prelude::*;
use pyo3::types::PyDict;
const CODE: &str = r#"
class A:
def method(self, *args, **kwargs):
assert args == ("hello",)
assert kwargs == {"cruel": "world"}
return "called with args and kwargs"
a = A()
"#;
Python::with_gil(|py| {
let module = PyModule::from_code_bound(py, CODE, "", "")?;
let instance = module.getattr("a")?;
let args = ("hello",);
let kwargs = PyDict::new_bound(py);
kwargs.set_item("cruel", "world")?;
let result = instance.call_method("method", args, Some(&kwargs))?;
assert_eq!(result.extract::<String>()?, "called with args and kwargs");
Ok(())
})
sourcepub fn call_method0<N>(&self, name: N) -> PyResult<&PyAny>
Available on crate feature gil-refs
only.
pub fn call_method0<N>(&self, name: N) -> PyResult<&PyAny>
gil-refs
only.Calls a method on the object without arguments.
This is equivalent to the Python expression self.name()
.
To avoid repeated temporary allocations of Python strings, the intern!
macro can be used
to intern name
.
§Examples
use pyo3::prelude::*;
const CODE: &str = r#"
class A:
def method(self, *args, **kwargs):
assert args == ()
assert kwargs == {}
return "called with no arguments"
a = A()
"#;
Python::with_gil(|py| {
let module = PyModule::from_code_bound(py, CODE, "", "")?;
let instance = module.getattr("a")?;
let result = instance.call_method0("method")?;
assert_eq!(result.extract::<String>()?, "called with no arguments");
Ok(())
})
sourcepub fn call_method1<N, A>(&self, name: N, args: A) -> PyResult<&PyAny>
Available on crate feature gil-refs
only.
pub fn call_method1<N, A>(&self, name: N, args: A) -> PyResult<&PyAny>
gil-refs
only.Calls a method on the object with only positional arguments.
This is equivalent to the Python expression self.name(*args)
.
To avoid repeated temporary allocations of Python strings, the intern!
macro can be used
to intern name
.
§Examples
use pyo3::prelude::*;
const CODE: &str = r#"
class A:
def method(self, *args, **kwargs):
assert args == ("hello",)
assert kwargs == {}
return "called with args"
a = A()
"#;
Python::with_gil(|py| {
let module = PyModule::from_code_bound(py, CODE, "", "")?;
let instance = module.getattr("a")?;
let args = ("hello",);
let result = instance.call_method1("method", args)?;
assert_eq!(result.extract::<String>()?, "called with args");
Ok(())
})
sourcepub fn is_true(&self) -> PyResult<bool>
👎Deprecated since 0.21.0: use .is_truthy()
insteadAvailable on crate feature gil-refs
only.
pub fn is_true(&self) -> PyResult<bool>
.is_truthy()
insteadgil-refs
only.Returns whether the object is considered to be true.
This is equivalent to the Python expression bool(self)
.
sourcepub fn is_truthy(&self) -> PyResult<bool>
Available on crate feature gil-refs
only.
pub fn is_truthy(&self) -> PyResult<bool>
gil-refs
only.Returns whether the object is considered to be true.
This applies truth value testing equivalent to the Python expression bool(self)
.
sourcepub fn is_none(&self) -> bool
Available on crate feature gil-refs
only.
pub fn is_none(&self) -> bool
gil-refs
only.Returns whether the object is considered to be None.
This is equivalent to the Python expression self is None
.
sourcepub fn is_ellipsis(&self) -> bool
👎Deprecated since 0.20.0: use .is(py.Ellipsis())
insteadAvailable on crate feature gil-refs
only.
pub fn is_ellipsis(&self) -> bool
.is(py.Ellipsis())
insteadgil-refs
only.Returns whether the object is Ellipsis, e.g. ...
.
This is equivalent to the Python expression self is ...
.
sourcepub fn is_empty(&self) -> PyResult<bool>
Available on crate feature gil-refs
only.
pub fn is_empty(&self) -> PyResult<bool>
gil-refs
only.Returns true if the sequence or mapping has a length of 0.
This is equivalent to the Python expression len(self) == 0
.
sourcepub fn get_item<K>(&self, key: K) -> PyResult<&PyAny>where
K: ToPyObject,
Available on crate feature gil-refs
only.
pub fn get_item<K>(&self, key: K) -> PyResult<&PyAny>where
K: ToPyObject,
gil-refs
only.Gets an item from the collection.
This is equivalent to the Python expression self[key]
.
sourcepub fn set_item<K, V>(&self, key: K, value: V) -> PyResult<()>where
K: ToPyObject,
V: ToPyObject,
Available on crate feature gil-refs
only.
pub fn set_item<K, V>(&self, key: K, value: V) -> PyResult<()>where
K: ToPyObject,
V: ToPyObject,
gil-refs
only.Sets a collection item value.
This is equivalent to the Python expression self[key] = value
.
sourcepub fn del_item<K>(&self, key: K) -> PyResult<()>where
K: ToPyObject,
Available on crate feature gil-refs
only.
pub fn del_item<K>(&self, key: K) -> PyResult<()>where
K: ToPyObject,
gil-refs
only.Deletes an item from the collection.
This is equivalent to the Python expression del self[key]
.
sourcepub fn iter(&self) -> PyResult<&PyIterator>
Available on crate feature gil-refs
only.
pub fn iter(&self) -> PyResult<&PyIterator>
gil-refs
only.Takes an object and returns an iterator for it.
This is typically a new iterator but if the argument is an iterator, this returns itself.
sourcepub fn get_type(&self) -> &PyType
Available on crate feature gil-refs
only.
pub fn get_type(&self) -> &PyType
gil-refs
only.Returns the Python type object for this object’s type.
sourcepub fn get_type_ptr(&self) -> *mut PyTypeObject
Available on crate feature gil-refs
only.
pub fn get_type_ptr(&self) -> *mut PyTypeObject
gil-refs
only.Returns the Python type pointer for this object.
sourcepub fn downcast<T>(&self) -> Result<&T, PyDowncastError<'_>>where
T: PyTypeCheck<AsRefTarget = T>,
Available on crate feature gil-refs
only.
pub fn downcast<T>(&self) -> Result<&T, PyDowncastError<'_>>where
T: PyTypeCheck<AsRefTarget = T>,
gil-refs
only.Downcast this PyAny
to a concrete Python type or pyclass.
Note that you can often avoid downcasting yourself by just specifying the desired type in function or method signatures. However, manual downcasting is sometimes necessary.
For extracting a Rust-only type, see PyAny::extract
.
§Example: Downcasting to a specific Python object
use pyo3::prelude::*;
use pyo3::types::{PyDict, PyList};
Python::with_gil(|py| {
let dict = PyDict::new_bound(py);
assert!(dict.is_instance_of::<PyAny>());
let any = dict.as_any();
assert!(any.downcast::<PyDict>().is_ok());
assert!(any.downcast::<PyList>().is_err());
});
§Example: Getting a reference to a pyclass
This is useful if you want to mutate a PyObject
that
might actually be a pyclass.
use pyo3::prelude::*;
#[pyclass]
struct Class {
i: i32,
}
Python::with_gil(|py| {
let class = Py::new(py, Class { i: 0 }).unwrap().into_bound(py).into_any();
let class_bound: &Bound<'_, Class> = class.downcast()?;
class_bound.borrow_mut().i += 1;
// Alternatively you can get a `PyRefMut` directly
let class_ref: PyRefMut<'_, Class> = class.extract()?;
assert_eq!(class_ref.i, 1);
Ok(())
})
sourcepub fn downcast_exact<T>(&self) -> Result<&T, PyDowncastError<'_>>where
T: PyTypeInfo<AsRefTarget = T>,
Available on crate feature gil-refs
only.
pub fn downcast_exact<T>(&self) -> Result<&T, PyDowncastError<'_>>where
T: PyTypeInfo<AsRefTarget = T>,
gil-refs
only.Downcast this PyAny
to a concrete Python type or pyclass (but not a subclass of it).
It is almost always better to use PyAny::downcast
because it accounts for Python
subtyping. Use this method only when you do not want to allow subtypes.
The advantage of this method over PyAny::downcast
is that it is faster. The implementation
of downcast_exact
uses the equivalent of the Python expression type(self) is T
, whereas
downcast
uses isinstance(self, T)
.
For extracting a Rust-only type, see PyAny::extract
.
§Example: Downcasting to a specific Python object but not a subtype
use pyo3::prelude::*;
use pyo3::types::{PyBool, PyLong};
Python::with_gil(|py| {
let b = PyBool::new_bound(py, true);
assert!(b.is_instance_of::<PyBool>());
let any: &Bound<'_, PyAny> = b.as_any();
// `bool` is a subtype of `int`, so `downcast` will accept a `bool` as an `int`
// but `downcast_exact` will not.
assert!(any.downcast::<PyLong>().is_ok());
assert!(any.downcast_exact::<PyLong>().is_err());
assert!(any.downcast_exact::<PyBool>().is_ok());
});
sourcepub unsafe fn downcast_unchecked<T>(&self) -> &Twhere
T: HasPyGilRef<AsRefTarget = T>,
Available on crate feature gil-refs
only.
pub unsafe fn downcast_unchecked<T>(&self) -> &Twhere
T: HasPyGilRef<AsRefTarget = T>,
gil-refs
only.Converts this PyAny
to a concrete Python type without checking validity.
§Safety
Callers must ensure that the type is valid or risk type confusion.
sourcepub fn extract<'py, D>(&'py self) -> PyResult<D>where
D: FromPyObjectBound<'py, 'py>,
Available on crate feature gil-refs
only.
pub fn extract<'py, D>(&'py self) -> PyResult<D>where
D: FromPyObjectBound<'py, 'py>,
gil-refs
only.Extracts some type from the Python object.
This is a wrapper function around
FromPyObject::extract()
.
sourcepub fn get_refcnt(&self) -> isize
Available on crate feature gil-refs
only.
pub fn get_refcnt(&self) -> isize
gil-refs
only.Returns the reference count for the Python object.
sourcepub fn repr(&self) -> PyResult<&PyString>
Available on crate feature gil-refs
only.
pub fn repr(&self) -> PyResult<&PyString>
gil-refs
only.Computes the “repr” representation of self.
This is equivalent to the Python expression repr(self)
.
sourcepub fn str(&self) -> PyResult<&PyString>
Available on crate feature gil-refs
only.
pub fn str(&self) -> PyResult<&PyString>
gil-refs
only.Computes the “str” representation of self.
This is equivalent to the Python expression str(self)
.
sourcepub fn hash(&self) -> PyResult<isize>
Available on crate feature gil-refs
only.
pub fn hash(&self) -> PyResult<isize>
gil-refs
only.Retrieves the hash code of self.
This is equivalent to the Python expression hash(self)
.
sourcepub fn len(&self) -> PyResult<usize>
Available on crate feature gil-refs
only.
pub fn len(&self) -> PyResult<usize>
gil-refs
only.Returns the length of the sequence or mapping.
This is equivalent to the Python expression len(self)
.
sourcepub fn dir(&self) -> PyResult<&PyList>
Available on crate feature gil-refs
only.
pub fn dir(&self) -> PyResult<&PyList>
gil-refs
only.Returns the list of attributes of this object.
This is equivalent to the Python expression dir(self)
.
sourcepub fn is_instance(&self, ty: &PyAny) -> PyResult<bool>
Available on crate feature gil-refs
only.
pub fn is_instance(&self, ty: &PyAny) -> PyResult<bool>
gil-refs
only.Checks whether this object is an instance of type ty
.
This is equivalent to the Python expression isinstance(self, ty)
.
sourcepub fn is_exact_instance(&self, ty: &PyAny) -> bool
Available on crate feature gil-refs
only.
pub fn is_exact_instance(&self, ty: &PyAny) -> bool
gil-refs
only.Checks whether this object is an instance of exactly type ty
(not a subclass).
This is equivalent to the Python expression type(self) is ty
.
sourcepub fn is_instance_of<T: PyTypeInfo>(&self) -> bool
Available on crate feature gil-refs
only.
pub fn is_instance_of<T: PyTypeInfo>(&self) -> bool
gil-refs
only.Checks whether this object is an instance of type T
.
This is equivalent to the Python expression isinstance(self, T)
,
if the type T
is known at compile time.
sourcepub fn is_exact_instance_of<T: PyTypeInfo>(&self) -> bool
Available on crate feature gil-refs
only.
pub fn is_exact_instance_of<T: PyTypeInfo>(&self) -> bool
gil-refs
only.Checks whether this object is an instance of exactly type T
.
This is equivalent to the Python expression type(self) is T
,
if the type T
is known at compile time.
sourcepub fn contains<V>(&self, value: V) -> PyResult<bool>where
V: ToPyObject,
Available on crate feature gil-refs
only.
pub fn contains<V>(&self, value: V) -> PyResult<bool>where
V: ToPyObject,
gil-refs
only.Determines if self contains value
.
This is equivalent to the Python expression value in self
.
sourcepub fn py(&self) -> Python<'_>
Available on crate feature gil-refs
only.
pub fn py(&self) -> Python<'_>
gil-refs
only.Returns a GIL marker constrained to the lifetime of this type.
sourcepub fn as_ptr(&self) -> *mut PyObject
Available on crate feature gil-refs
only.
pub fn as_ptr(&self) -> *mut PyObject
gil-refs
only.Returns the raw FFI pointer represented by self.
§Safety
Callers are responsible for ensuring that the pointer does not outlive self.
The reference is borrowed; callers should not decrease the reference count when they are finished with the pointer.
sourcepub fn into_ptr(&self) -> *mut PyObject
Available on crate feature gil-refs
only.
pub fn into_ptr(&self) -> *mut PyObject
gil-refs
only.Returns an owned raw FFI pointer represented by self.
§Safety
The reference is owned; when finished the caller should either transfer ownership
of the pointer or decrease the reference count (e.g. with pyo3::ffi::Py_DecRef
).
Trait Implementations§
source§impl AsPyPointer for PyByteArray
impl AsPyPointer for PyByteArray
source§impl AsRef<PyAny> for PyByteArray
impl AsRef<PyAny> for PyByteArray
source§impl Debug for PyByteArray
Available on crate feature gil-refs
only.
impl Debug for PyByteArray
gil-refs
only.source§impl Deref for PyByteArray
impl Deref for PyByteArray
source§impl Display for PyByteArray
Available on crate feature gil-refs
only.
impl Display for PyByteArray
gil-refs
only.source§impl<'a> From<&'a PyByteArray> for &'a PyAny
Available on crate feature gil-refs
only.
impl<'a> From<&'a PyByteArray> for &'a PyAny
gil-refs
only.source§fn from(ob: &'a PyByteArray) -> Self
fn from(ob: &'a PyByteArray) -> Self
source§impl From<&PyByteArray> for Py<PyByteArray>
Available on crate feature gil-refs
only.
impl From<&PyByteArray> for Py<PyByteArray>
gil-refs
only.source§fn from(other: &PyByteArray) -> Self
fn from(other: &PyByteArray) -> Self
source§impl<'py> FromPyObject<'py> for &'py PyByteArray
Available on crate feature gil-refs
only.
impl<'py> FromPyObject<'py> for &'py PyByteArray
gil-refs
only.source§impl IntoPy<Py<PyByteArray>> for &PyByteArray
Available on crate feature gil-refs
only.
impl IntoPy<Py<PyByteArray>> for &PyByteArray
gil-refs
only.source§impl PyNativeType for PyByteArray
Available on crate feature gil-refs
only.
impl PyNativeType for PyByteArray
gil-refs
only.source§type AsRefSource = PyByteArray
type AsRefSource = PyByteArray
Py<T>
smart pointer.source§fn as_borrowed(&self) -> Borrowed<'_, '_, Self::AsRefSource>
fn as_borrowed(&self) -> Borrowed<'_, '_, Self::AsRefSource>
source§unsafe fn unchecked_downcast(obj: &PyAny) -> &Self
unsafe fn unchecked_downcast(obj: &PyAny) -> &Self
source§impl PyTypeInfo for PyByteArray
impl PyTypeInfo for PyByteArray
source§const MODULE: Option<&'static str> = _
const MODULE: Option<&'static str> = _
gil-refs
only.source§fn type_object_raw(py: Python<'_>) -> *mut PyTypeObject
fn type_object_raw(py: Python<'_>) -> *mut PyTypeObject
gil-refs
only.source§fn is_type_of_bound(obj: &Bound<'_, PyAny>) -> bool
fn is_type_of_bound(obj: &Bound<'_, PyAny>) -> bool
gil-refs
only.object
is an instance of this type or a subclass of this type.source§fn type_object(py: Python<'_>) -> &PyType
fn type_object(py: Python<'_>) -> &PyType
PyTypeInfo::type_object
will be replaced by PyTypeInfo::type_object_bound
in a future PyO3 versiongil-refs
only.source§fn type_object_bound(py: Python<'_>) -> Bound<'_, PyType>
fn type_object_bound(py: Python<'_>) -> Bound<'_, PyType>
gil-refs
only.source§fn is_type_of(object: &PyAny) -> bool
fn is_type_of(object: &PyAny) -> bool
PyTypeInfo::is_type_of
will be replaced by PyTypeInfo::is_type_of_bound
in a future PyO3 versiongil-refs
only.object
is an instance of this type or a subclass of this type.source§fn is_exact_type_of(object: &PyAny) -> bool
fn is_exact_type_of(object: &PyAny) -> bool
PyTypeInfo::is_exact_type_of
will be replaced by PyTypeInfo::is_exact_type_of_bound
in a future PyO3 versiongil-refs
only.object
is an instance of this type.source§impl ToPyObject for PyByteArray
Available on crate feature gil-refs
only.
impl ToPyObject for PyByteArray
gil-refs
only.source§impl<'py> TryFrom<&'py PyAny> for &'py PyByteArray
Available on crate feature gil-refs
only.
impl<'py> TryFrom<&'py PyAny> for &'py PyByteArray
gil-refs
only.impl DerefToPyAny for PyByteArray
Auto Trait Implementations§
impl !Freeze for PyByteArray
impl !RefUnwindSafe for PyByteArray
impl !Send for PyByteArray
impl !Sync for PyByteArray
impl Unpin for PyByteArray
impl UnwindSafe for PyByteArray
Blanket Implementations§
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<'p, T> FromPyPointer<'p> for Twhere
T: 'p + PyNativeType,
impl<'p, T> FromPyPointer<'p> for Twhere
T: 'p + PyNativeType,
source§unsafe fn from_owned_ptr_or_opt(
py: Python<'p>,
ptr: *mut PyObject,
) -> Option<&'p T>
unsafe fn from_owned_ptr_or_opt( py: Python<'p>, ptr: *mut PyObject, ) -> Option<&'p T>
Py::from_owned_ptr_or_opt(py, ptr)
or Bound::from_owned_ptr_or_opt(py, ptr)
insteadgil-refs
only.PyObject
. Read moresource§unsafe fn from_borrowed_ptr_or_opt(
_py: Python<'p>,
ptr: *mut PyObject,
) -> Option<&'p T>
unsafe fn from_borrowed_ptr_or_opt( _py: Python<'p>, ptr: *mut PyObject, ) -> Option<&'p T>
Py::from_borrowed_ptr_or_opt(py, ptr)
or Bound::from_borrowed_ptr_or_opt(py, ptr)
insteadgil-refs
only.PyObject
. Read moresource§unsafe fn from_owned_ptr_or_panic(
py: Python<'p>,
ptr: *mut PyObject,
) -> &'p Self
unsafe fn from_owned_ptr_or_panic( py: Python<'p>, ptr: *mut PyObject, ) -> &'p Self
Py::from_owned_ptr(py, ptr)
or Bound::from_owned_ptr(py, ptr)
insteadgil-refs
only.PyObject
or panic. Read moresource§unsafe fn from_owned_ptr(py: Python<'p>, ptr: *mut PyObject) -> &'p Self
unsafe fn from_owned_ptr(py: Python<'p>, ptr: *mut PyObject) -> &'p Self
Py::from_owned_ptr(py, ptr)
or Bound::from_owned_ptr(py, ptr)
insteadgil-refs
only.PyObject
or panic. Read moresource§unsafe fn from_owned_ptr_or_err(
py: Python<'p>,
ptr: *mut PyObject,
) -> PyResult<&'p Self>
unsafe fn from_owned_ptr_or_err( py: Python<'p>, ptr: *mut PyObject, ) -> PyResult<&'p Self>
Py::from_owned_ptr_or_err(py, ptr)
or Bound::from_owned_ptr_or_err(py, ptr)
insteadgil-refs
only.PyObject
. Read moresource§unsafe fn from_borrowed_ptr_or_panic(
py: Python<'p>,
ptr: *mut PyObject,
) -> &'p Self
unsafe fn from_borrowed_ptr_or_panic( py: Python<'p>, ptr: *mut PyObject, ) -> &'p Self
Py::from_borrowed_ptr(py, ptr)
or Bound::from_borrowed_ptr(py, ptr)
insteadgil-refs
only.PyObject
. Read moresource§unsafe fn from_borrowed_ptr(py: Python<'p>, ptr: *mut PyObject) -> &'p Self
unsafe fn from_borrowed_ptr(py: Python<'p>, ptr: *mut PyObject) -> &'p Self
Py::from_borrowed_ptr(py, ptr)
or Bound::from_borrowed_ptr(py, ptr)
insteadgil-refs
only.PyObject
. Read moresource§unsafe fn from_borrowed_ptr_or_err(
py: Python<'p>,
ptr: *mut PyObject,
) -> PyResult<&'p Self>
unsafe fn from_borrowed_ptr_or_err( py: Python<'p>, ptr: *mut PyObject, ) -> PyResult<&'p Self>
Py::from_borrowed_ptr_or_err(py, ptr)
or Bound::from_borrowed_ptr_or_err(py, ptr)
insteadgil-refs
only.PyObject
. Read moresource§impl<T> HasPyGilRef for Twhere
T: PyNativeType,
impl<T> HasPyGilRef for Twhere
T: PyNativeType,
source§type AsRefTarget = T
type AsRefTarget = T
gil-refs
only.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<'v, T> PyTryFrom<'v> for Twhere
T: PyTypeInfo<AsRefTarget = T> + PyNativeType,
impl<'v, T> PyTryFrom<'v> for Twhere
T: PyTypeInfo<AsRefTarget = T> + PyNativeType,
source§fn try_from<V>(value: V) -> Result<&'v T, PyDowncastError<'v>>
fn try_from<V>(value: V) -> Result<&'v T, PyDowncastError<'v>>
value.downcast::<T>()
instead of T::try_from(value)
gil-refs
only.source§fn try_from_exact<V>(value: V) -> Result<&'v T, PyDowncastError<'v>>
fn try_from_exact<V>(value: V) -> Result<&'v T, PyDowncastError<'v>>
value.downcast_exact::<T>()
instead of T::try_from_exact(value)
gil-refs
only.source§unsafe fn try_from_unchecked<V>(value: V) -> &'v T
unsafe fn try_from_unchecked<V>(value: V) -> &'v T
value.downcast_unchecked::<T>()
instead of T::try_from_unchecked(value)
gil-refs
only.