Struct numpy::PyReadonlyArray
source · [−]pub struct PyReadonlyArray<'py, T, D> { /* private fields */ }
Expand description
Readonly reference of PyArray
.
This struct ensures that the internal array is not writeable while holding PyReadonlyArray
.
We use a simple trick for this: modifying the internal flag of the array when creating
PyReadonlyArray
and recover the original flag when it drops.
So, importantly, it does not recover the original flag when it does not drop
(e.g., by the use of IntoPy::intopy
or std::mem::forget
)
and then the internal array remains readonly.
Example
In this example, we get a ‘temporal’ readonly array and the internal array becomes writeble again after it drops.
use numpy::{PyArray, npyffi::NPY_ARRAY_WRITEABLE};
pyo3::Python::with_gil(|py| {
let py_array = PyArray::arange(py, 0, 4, 1).reshape([2, 2]).unwrap();
{
let readonly = py_array.readonly();
// The internal array is not writeable now.
pyo3::py_run!(py, py_array, "assert not py_array.flags['WRITEABLE']");
}
// After the `readonly` drops, the internal array gets writeable again.
pyo3::py_run!(py, py_array, "assert py_array.flags['WRITEABLE']");
});
However, if we convert the PyReadonlyArray
directly into PyObject
,
the internal array remains readonly.
use numpy::{PyArray, npyffi::NPY_ARRAY_WRITEABLE};
use pyo3::{IntoPy, PyObject, Python};
pyo3::Python::with_gil(|py| {
let py_array = PyArray::arange(py, 0, 4, 1).reshape([2, 2]).unwrap();
let obj: PyObject = {
let readonly = py_array.readonly();
// The internal array is not writeable now.
pyo3::py_run!(py, py_array, "assert not py_array.flags['WRITEABLE']");
readonly.into_py(py)
};
// The internal array remains readonly.
pyo3::py_run!(py, py_array, "assert py_array.flags['WRITEABLE']");
});
Implementations
sourceimpl<'py, T: Element, D: Dimension> PyReadonlyArray<'py, T, D>
impl<'py, T: Element, D: Dimension> PyReadonlyArray<'py, T, D>
sourcepub fn as_slice(&self) -> Result<&[T], NotContiguousError>
pub fn as_slice(&self) -> Result<&[T], NotContiguousError>
Returns the immutable view of the internal data of PyArray
as slice.
Returns ErrorKind::NotContiguous
if the internal array is not contiguous.
Example
use numpy::{PyArray, PyArray1};
use pyo3::types::IntoPyDict;
pyo3::Python::with_gil(|py| {
let py_array = PyArray::arange(py, 0, 4, 1).reshape([2, 2]).unwrap();
let readonly = py_array.readonly();
assert_eq!(readonly.as_slice().unwrap(), &[0, 1, 2, 3]);
let locals = [("np", numpy::get_array_module(py).unwrap())].into_py_dict(py);
let not_contiguous: &PyArray1<i32> = py
.eval("np.arange(10, dtype='int32')[::2]", Some(locals), None)
.unwrap()
.downcast()
.unwrap();
assert!(not_contiguous.readonly().as_slice().is_err());
});
sourcepub fn as_array(&self) -> ArrayView<'_, T, D>
pub fn as_array(&self) -> ArrayView<'_, T, D>
Get the immutable view of the internal data of PyArray
, as
ndarray::ArrayView
.
Example
use numpy::PyArray;
pyo3::Python::with_gil(|py| {
let array = PyArray::arange(py, 0, 4, 1).reshape([2, 2]).unwrap();
let readonly = array.readonly();
assert_eq!(readonly.as_array(), array![[0, 1], [2, 3]]);
});
sourcepub fn get(&self, index: impl NpyIndex<Dim = D>) -> Option<&T>
pub fn get(&self, index: impl NpyIndex<Dim = D>) -> Option<&T>
Get an immutable reference of the specified element, with checking the passed index is valid.
See NpyIndex for what types you can use as index.
If you pass an invalid index to this function, it returns None
.
Example
use numpy::PyArray;
pyo3::Python::with_gil(|py| {
let arr = PyArray::arange(py, 0, 16, 1).reshape([2, 2, 4]).unwrap().readonly();
assert_eq!(*arr.get([1, 0, 3]).unwrap(), 11);
assert!(arr.get([2, 0, 3]).is_none());
});
For fixed dimension arrays, passing an index with invalid dimension causes compile error.
use numpy::PyArray;
pyo3::Python::with_gil(|py| {
let arr = PyArray::arange(py, 0, 16, 1).reshape([2, 2, 4]).unwrap().readonly();
let a = arr.get([1, 2]); // Compile Error!
});
However, for dinamic arrays, we cannot raise a compile error and just returns None
.
use numpy::PyArray;
pyo3::Python::with_gil(|py| {
let arr = PyArray::arange(py, 0, 16, 1).reshape([2, 2, 4]).unwrap().readonly();
let arr = arr.to_dyn().readonly();
assert!(arr.get([1, 2].as_ref()).is_none());
});
sourcepub fn iter(self) -> PyResult<NpySingleIter<'py, T, Readonly>>
👎 Deprecated: The wrappers of the array iterator API are deprecated, please use ndarray’s ArrayBase::iter
instead.
pub fn iter(self) -> PyResult<NpySingleIter<'py, T, Readonly>>
The wrappers of the array iterator API are deprecated, please use ndarray’s ArrayBase::iter
instead.
Iterates all elements of this array. See NpySingleIter for more.
Methods from Deref<Target = PyArray<T, D>>
sourcepub fn as_array_ptr(&self) -> *mut PyArrayObject
pub fn as_array_ptr(&self) -> *mut PyArrayObject
Gets a raw PyArrayObject
pointer.
sourcepub fn dtype(&self) -> &PyArrayDescr
pub fn dtype(&self) -> &PyArrayDescr
Returns dtype
of the array.
Counterpart of array.dtype
in Python.
Example
pyo3::Python::with_gil(|py| {
let array = numpy::PyArray::from_vec(py, vec![1, 2, 3i32]);
let dtype = array.dtype();
assert!(dtype.is_equiv_to(numpy::dtype::<i32>(py)));
});
sourcepub fn readonly(&self) -> PyReadonlyArray<'_, T, D>
pub fn readonly(&self) -> PyReadonlyArray<'_, T, D>
Returns a temporally unwriteable reference of the array.
sourcepub fn is_contiguous(&self) -> bool
pub fn is_contiguous(&self) -> bool
Returns true
if the internal data of the array is C-style contiguous
(default of numpy and ndarray) or Fortran-style contiguous.
Example
use pyo3::types::IntoPyDict;
pyo3::Python::with_gil(|py| {
let array = numpy::PyArray::arange(py, 0, 10, 1);
assert!(array.is_contiguous());
let locals = [("np", numpy::get_array_module(py).unwrap())].into_py_dict(py);
let not_contiguous: &numpy::PyArray1<f32> = py
.eval("np.zeros((3, 5), dtype='float32')[::2, 4]", Some(locals), None)
.unwrap()
.downcast()
.unwrap();
assert!(!not_contiguous.is_contiguous());
});
sourcepub fn is_fortran_contiguous(&self) -> bool
pub fn is_fortran_contiguous(&self) -> bool
Returns true
if the internal data of the array is Fortran-style contiguous.
sourcepub fn is_c_contiguous(&self) -> bool
pub fn is_c_contiguous(&self) -> bool
Returns true
if the internal data of the array is C-style contiguous.
sourcepub fn to_owned(&self) -> Py<Self>
pub fn to_owned(&self) -> Py<Self>
Get Py<PyArray>
from &PyArray
, which is the owned wrapper of PyObject.
You can use this method when you have to avoid lifetime annotation to your function args
or return types, like used with pyo3’s pymethod
.
Example
use numpy::PyArray1;
fn return_py_array() -> pyo3::Py<PyArray1<i32>> {
pyo3::Python::with_gil(|py| PyArray1::zeros(py, [5], false).to_owned())
}
let array = return_py_array();
pyo3::Python::with_gil(|py| {
assert_eq!(array.as_ref(py).readonly().as_slice().unwrap(), &[0, 0, 0, 0, 0]);
});
sourcepub fn ndim(&self) -> usize
pub fn ndim(&self) -> usize
Returns the number of dimensions in the array.
Same as numpy.ndarray.ndim
Example
use numpy::PyArray3;
pyo3::Python::with_gil(|py| {
let arr = PyArray3::<f64>::zeros(py, [4, 5, 6], false);
assert_eq!(arr.ndim(), 3);
});
sourcepub fn strides(&self) -> &[isize]
pub fn strides(&self) -> &[isize]
Returns a slice which contains how many bytes you need to jump to the next row.
Same as numpy.ndarray.strides
Example
use numpy::PyArray3;
pyo3::Python::with_gil(|py| {
let arr = PyArray3::<f64>::zeros(py, [4, 5, 6], false);
assert_eq!(arr.strides(), &[240, 48, 8]);
});
sourcepub fn shape(&self) -> &[usize]
pub fn shape(&self) -> &[usize]
Returns a slice which contains dimmensions of the array.
Same as numpy.ndarray.shape
Example
use numpy::PyArray3;
pyo3::Python::with_gil(|py| {
let arr = PyArray3::<f64>::zeros(py, [4, 5, 6], false);
assert_eq!(arr.shape(), &[4, 5, 6]);
});
pub fn is_empty(&self) -> bool
sourcepub unsafe fn as_slice(&self) -> Result<&[T], NotContiguousError>
pub unsafe fn as_slice(&self) -> Result<&[T], NotContiguousError>
Returns the immutable view of the internal data of PyArray
as slice.
Please consider the use of the safe alternative PyReadonlyArray::as_slice
.
Safety
If the internal array is not readonly and can be mutated from Python code, holding the slice might cause undefined behavior.
sourcepub unsafe fn as_slice_mut(&self) -> Result<&mut [T], NotContiguousError>
pub unsafe fn as_slice_mut(&self) -> Result<&mut [T], NotContiguousError>
Returns the view of the internal data of PyArray
as mutable slice.
Safety
If another reference to the internal data exists(e.g., &[T]
or ArrayView
),
it might cause undefined behavior.
sourcepub unsafe fn get(&self, index: impl NpyIndex<Dim = D>) -> Option<&T>
pub unsafe fn get(&self, index: impl NpyIndex<Dim = D>) -> Option<&T>
Get the immutable reference of the specified element, with checking the passed index is valid.
Please consider the use of safe alternatives
(PyReadonlyArray::get
or get_owned
) instead of this.
Example
use numpy::PyArray;
pyo3::Python::with_gil(|py| {
let arr = PyArray::arange(py, 0, 16, 1).reshape([2, 2, 4]).unwrap();
assert_eq!(*unsafe { arr.get([1, 0, 3]) }.unwrap(), 11);
});
Safety
If the internal array is not readonly and can be mutated from Python code, holding the slice might cause undefined behavior.
sourcepub unsafe fn uget<Idx>(&self, index: Idx) -> &T where
Idx: NpyIndex<Dim = D>,
pub unsafe fn uget<Idx>(&self, index: Idx) -> &T where
Idx: NpyIndex<Dim = D>,
Get the immutable reference of the specified element, without checking the passed index is valid.
See NpyIndex for what types you can use as index.
Safety
Passing an invalid index is undefined behavior. The element must also have been initialized. The elemet must also not be modified by Python code.
Example
use numpy::PyArray;
pyo3::Python::with_gil(|py| {
let arr = PyArray::arange(py, 0, 16, 1).reshape([2, 2, 4]).unwrap();
assert_eq!(unsafe { *arr.uget([1, 0, 3]) }, 11);
});
sourcepub fn to_dyn(&self) -> &PyArray<T, IxDyn>
pub fn to_dyn(&self) -> &PyArray<T, IxDyn>
Get dynamic dimensioned array from fixed dimension array.
sourcepub fn to_vec(&self) -> Result<Vec<T>, NotContiguousError>
pub fn to_vec(&self) -> Result<Vec<T>, NotContiguousError>
Returns the copy of the internal data of PyArray
to Vec
.
Returns ErrorKind::NotContiguous
if the internal array is not contiguous.
See also as_slice
Example
use numpy::PyArray2;
use pyo3::types::IntoPyDict;
pyo3::Python::with_gil(|py| {
let locals = [("np", numpy::get_array_module(py).unwrap())].into_py_dict(py);
let array: &PyArray2<i64> = py
.eval("np.array([[0, 1], [2, 3]], dtype='int64')", Some(locals), None)
.unwrap()
.downcast()
.unwrap();
assert_eq!(array.to_vec().unwrap(), vec![0, 1, 2, 3]);
});
sourcepub unsafe fn as_array(&self) -> ArrayView<'_, T, D>
pub unsafe fn as_array(&self) -> ArrayView<'_, T, D>
Get the immutable view of the internal data of PyArray
, as
ndarray::ArrayView
.
Please consider the use of safe alternatives
(PyReadonlyArray::as_array
or to_array
) instead of this.
Safety
If the internal array is not readonly and can be mutated from Python code,
holding the ArrayView
might cause undefined behavior.
sourcepub unsafe fn as_array_mut(&self) -> ArrayViewMut<'_, T, D>
pub unsafe fn as_array_mut(&self) -> ArrayViewMut<'_, T, D>
Returns the internal array as ArrayViewMut
. See also as_array
.
Safety
If another reference to the internal data exists(e.g., &[T]
or ArrayView
),
it might cause undefined behavior.
sourcepub fn as_raw_array(&self) -> RawArrayView<T, D>
pub fn as_raw_array(&self) -> RawArrayView<T, D>
Returns the internal array as RawArrayView
enabling element access via raw pointers
sourcepub fn as_raw_array_mut(&self) -> RawArrayViewMut<T, D>
pub fn as_raw_array_mut(&self) -> RawArrayViewMut<T, D>
Returns the internal array as RawArrayViewMut
enabling element access via raw pointers
sourcepub fn to_owned_array(&self) -> Array<T, D>
pub fn to_owned_array(&self) -> Array<T, D>
Get a copy of PyArray
as
ndarray::Array
.
Example
use numpy::PyArray;
pyo3::Python::with_gil(|py| {
let py_array = PyArray::arange(py, 0, 4, 1).reshape([2, 2]).unwrap();
assert_eq!(
py_array.to_owned_array(),
array![[0, 1], [2, 3]]
)
});
sourcepub fn resize(&self, new_elems: usize) -> PyResult<()>
pub fn resize(&self, new_elems: usize) -> PyResult<()>
Extends or trancates the length of 1 dimension PyArray.
Example
use numpy::PyArray;
pyo3::Python::with_gil(|py| {
let pyarray = PyArray::arange(py, 0, 10, 1);
assert_eq!(pyarray.len(), 10);
pyarray.resize(100).unwrap();
assert_eq!(pyarray.len(), 100);
});
sourcepub unsafe fn iter<'py>(&'py self) -> PyResult<NpySingleIter<'py, T, ReadWrite>>
👎 Deprecated: The wrappers of the array iterator API are deprecated, please use ndarray’s ArrayBase::iter_mut
instead.
pub unsafe fn iter<'py>(&'py self) -> PyResult<NpySingleIter<'py, T, ReadWrite>>
The wrappers of the array iterator API are deprecated, please use ndarray’s ArrayBase::iter_mut
instead.
Iterates all elements of this array. See NpySingleIter for more.
Safety
The iterator will produce mutable references into the array which must not be aliased by other references for the life time of the iterator.
sourcepub fn copy_to<U: Element>(&self, other: &PyArray<U, D>) -> PyResult<()>
pub fn copy_to<U: Element>(&self, other: &PyArray<U, D>) -> PyResult<()>
Copies self into other
, performing a data-type conversion if necessary.
Example
use numpy::PyArray;
pyo3::Python::with_gil(|py| {
let pyarray_f = PyArray::arange(py, 2.0, 5.0, 1.0);
let pyarray_i = unsafe { PyArray::<i64, _>::new(py, [3], false) };
assert!(pyarray_f.copy_to(pyarray_i).is_ok());
assert_eq!(pyarray_i.readonly().as_slice().unwrap(), &[2, 3, 4]);
});
sourcepub fn cast<'py, U: Element>(
&'py self,
is_fortran: bool
) -> PyResult<&'py PyArray<U, D>>
pub fn cast<'py, U: Element>(
&'py self,
is_fortran: bool
) -> PyResult<&'py PyArray<U, D>>
Cast the PyArray<T>
to PyArray<U>
, by allocating a new array.
Example
use numpy::PyArray;
pyo3::Python::with_gil(|py| {
let pyarray_f = PyArray::arange(py, 2.0, 5.0, 1.0);
let pyarray_i = pyarray_f.cast::<i32>(false).unwrap();
assert!(pyarray_f.copy_to(pyarray_i).is_ok());
assert_eq!(pyarray_i.readonly().as_slice().unwrap(), &[2, 3, 4]);
});
sourcepub fn reshape<'py, ID, D2>(
&'py self,
dims: ID
) -> PyResult<&'py PyArray<T, D2>> where
ID: IntoDimension<Dim = D2>,
D2: Dimension,
pub fn reshape<'py, ID, D2>(
&'py self,
dims: ID
) -> PyResult<&'py PyArray<T, D2>> where
ID: IntoDimension<Dim = D2>,
D2: Dimension,
Construct a new array which has same values as self, same matrix order, but has different
dimensions specified by dims
.
Since a returned array can contain a same pointer as self, we highly recommend to drop an
old array, if this method returns Ok
.
Example
use numpy::PyArray;
pyo3::Python::with_gil(|py| {
let array = PyArray::from_exact_iter(py, 0..9);
let array = array.reshape([3, 3]).unwrap();
assert_eq!(array.readonly().as_array(), array![[0, 1, 2], [3, 4, 5], [6, 7, 8]]);
assert!(array.reshape([5]).is_err());
});
sourcepub fn reshape_with_order<'py, ID, D2>(
&'py self,
dims: ID,
order: NPY_ORDER
) -> PyResult<&'py PyArray<T, D2>> where
ID: IntoDimension<Dim = D2>,
D2: Dimension,
pub fn reshape_with_order<'py, ID, D2>(
&'py self,
dims: ID,
order: NPY_ORDER
) -> PyResult<&'py PyArray<T, D2>> where
ID: IntoDimension<Dim = D2>,
D2: Dimension,
Same as reshape, but you can change the order of returned matrix.
Methods from Deref<Target = PyAny>
sourcepub fn downcast<T>(&self) -> Result<&T, PyDowncastError<'_>> where
T: for<'py> PyTryFrom<'py>,
pub fn downcast<T>(&self) -> Result<&T, PyDowncastError<'_>> where
T: for<'py> PyTryFrom<'py>,
Converts this PyAny
to a concrete Python type.
Examples
use pyo3::prelude::*;
use pyo3::types::{PyAny, PyDict, PyList};
Python::with_gil(|py| {
let dict = PyDict::new(py);
assert!(dict.is_instance_of::<PyAny>().unwrap());
let any: &PyAny = dict.as_ref();
assert!(any.downcast::<PyDict>().is_ok());
assert!(any.downcast::<PyList>().is_err());
});
sourcepub fn is<T>(&self, other: &T) -> bool where
T: AsPyPointer,
pub fn is<T>(&self, other: &T) -> bool where
T: AsPyPointer,
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) -> Result<bool, PyErr> where
N: ToPyObject,
pub fn hasattr<N>(&self, attr_name: N) -> Result<bool, PyErr> where
N: ToPyObject,
Determines whether this object has the given attribute.
This is equivalent to the Python expression hasattr(self, attr_name)
.
sourcepub fn getattr<N>(&self, attr_name: N) -> Result<&PyAny, PyErr> where
N: ToPyObject,
pub fn getattr<N>(&self, attr_name: N) -> Result<&PyAny, PyErr> where
N: ToPyObject,
Retrieves an attribute value.
This is equivalent to the Python expression self.attr_name
.
sourcepub fn setattr<N, V>(&self, attr_name: N, value: V) -> Result<(), PyErr> where
N: ToBorrowedObject,
V: ToBorrowedObject,
pub fn setattr<N, V>(&self, attr_name: N, value: V) -> Result<(), PyErr> where
N: ToBorrowedObject,
V: ToBorrowedObject,
Sets an attribute value.
This is equivalent to the Python expression self.attr_name = value
.
sourcepub fn delattr<N>(&self, attr_name: N) -> Result<(), PyErr> where
N: ToPyObject,
pub fn delattr<N>(&self, attr_name: N) -> Result<(), PyErr> where
N: ToPyObject,
Deletes an attribute.
This is equivalent to the Python statement del self.attr_name
.
sourcepub fn compare<O>(&self, other: O) -> Result<Ordering, PyErr> where
O: ToPyObject,
pub fn compare<O>(&self, other: O) -> Result<Ordering, PyErr> where
O: ToPyObject,
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(py, 0_f64);
let b = PyFloat::new(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(py, 0_f64);
let b = PyString::new(py, "zero");
assert!(a.compare(b).is_err());
Ok(())
})?;
sourcepub fn rich_compare<O>(
&self,
other: O,
compare_op: CompareOp
) -> Result<&PyAny, PyErr> where
O: ToPyObject,
pub fn rich_compare<O>(
&self,
other: O,
compare_op: CompareOp
) -> Result<&PyAny, PyErr> where
O: ToPyObject,
Tests whether two Python objects obey a given CompareOp
.
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: &PyInt = 0_u8.into_py(py).into_ref(py).downcast()?;
let b: &PyInt = 42_u8.into_py(py).into_ref(py).downcast()?;
assert!(a.rich_compare(b, CompareOp::Le)?.is_true()?);
Ok(())
})?;
sourcepub fn lt<O>(&self, other: O) -> Result<bool, PyErr> where
O: ToPyObject,
pub fn lt<O>(&self, other: O) -> Result<bool, PyErr> where
O: ToPyObject,
Tests whether this object is less than another.
This is equivalent to the Python expression self < other
.
sourcepub fn le<O>(&self, other: O) -> Result<bool, PyErr> where
O: ToPyObject,
pub fn le<O>(&self, other: O) -> Result<bool, PyErr> where
O: ToPyObject,
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) -> Result<bool, PyErr> where
O: ToPyObject,
pub fn eq<O>(&self, other: O) -> Result<bool, PyErr> where
O: ToPyObject,
Tests whether this object is equal to another.
This is equivalent to the Python expression self == other
.
sourcepub fn ne<O>(&self, other: O) -> Result<bool, PyErr> where
O: ToPyObject,
pub fn ne<O>(&self, other: O) -> Result<bool, PyErr> where
O: ToPyObject,
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) -> Result<bool, PyErr> where
O: ToPyObject,
pub fn gt<O>(&self, other: O) -> Result<bool, PyErr> where
O: ToPyObject,
Tests whether this object is greater than another.
This is equivalent to the Python expression self > other
.
sourcepub fn ge<O>(&self, other: O) -> Result<bool, PyErr> where
O: ToPyObject,
pub fn ge<O>(&self, other: O) -> Result<bool, PyErr> where
O: ToPyObject,
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
pub fn is_callable(&self) -> bool
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(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>
) -> Result<&PyAny, PyErr>
pub fn call(
&self,
args: impl IntoPy<Py<PyTuple>>,
kwargs: Option<&PyDict>
) -> Result<&PyAny, PyErr>
Calls the object.
This is equivalent to the Python expression self(*args, **kwargs)
.
sourcepub fn call0(&self) -> Result<&PyAny, PyErr>
pub fn call0(&self) -> Result<&PyAny, PyErr>
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(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>>) -> Result<&PyAny, PyErr>
pub fn call1(&self, args: impl IntoPy<Py<PyTuple>>) -> Result<&PyAny, PyErr>
Calls the object with only positional arguments.
This is equivalent to the Python expression self(*args)
.
Examples
use pyo3::prelude::*;
Python::with_gil(|py| -> PyResult<()> {
let module = PyModule::import(py, "operator")?;
let add = module.getattr("add")?;
let args = (1, 2);
let value = add.call1(args)?;
assert_eq!(value.extract::<i32>()?, 3);
Ok(())
})?;
This is equivalent to the following Python code:
from operator import add
value = add(1,2)
assert value == 3
sourcepub fn call_method(
&self,
name: &str,
args: impl IntoPy<Py<PyTuple>>,
kwargs: Option<&PyDict>
) -> Result<&PyAny, PyErr>
pub fn call_method(
&self,
name: &str,
args: impl IntoPy<Py<PyTuple>>,
kwargs: Option<&PyDict>
) -> Result<&PyAny, PyErr>
Calls a method on the object.
This is equivalent to the Python expression self.name(*args, **kwargs)
.
Examples
use pyo3::prelude::*;
use pyo3::types::{IntoPyDict, PyList};
Python::with_gil(|py| -> PyResult<()> {
let list = PyList::new(py, vec![3, 6, 5, 4, 7]);
let kwargs = vec![("reverse", true)].into_py_dict(py);
list.call_method("sort", (), Some(kwargs))?;
assert_eq!(list.extract::<Vec<i32>>()?, vec![7, 6, 5, 4, 3]);
Ok(())
})?;
This is equivalent to the following Python code:
my_list = [3, 6, 5, 4, 7]
my_list.sort(reverse = True)
assert my_list == [7, 6, 5, 4, 3]
sourcepub fn call_method0(&self, name: &str) -> Result<&PyAny, PyErr>
pub fn call_method0(&self, name: &str) -> Result<&PyAny, PyErr>
Calls a method on the object without arguments.
This is equivalent to the Python expression self.name()
.
Examples
use pyo3::prelude::*;
use pyo3::types::PyFloat;
use std::f64::consts::PI;
Python::with_gil(|py| -> PyResult<()> {
let pi = PyFloat::new(py, PI);
let ratio = pi.call_method0("as_integer_ratio")?;
let (a, b) = ratio.extract::<(u64, u64)>()?;
assert_eq!(a, 884_279_719_003_555);
assert_eq!(b, 281_474_976_710_656);
Ok(())
})?;
This is equivalent to the following Python code:
import math
a, b = math.pi.as_integer_ratio()
sourcepub fn call_method1(
&self,
name: &str,
args: impl IntoPy<Py<PyTuple>>
) -> Result<&PyAny, PyErr>
pub fn call_method1(
&self,
name: &str,
args: impl IntoPy<Py<PyTuple>>
) -> Result<&PyAny, PyErr>
Calls a method on the object with only positional arguments.
This is equivalent to the Python expression self.name(*args)
.
Examples
use pyo3::prelude::*;
use pyo3::types::PyList;
Python::with_gil(|py| -> PyResult<()> {
let list = PyList::new(py, vec![1, 3, 4]);
list.call_method1("insert", (1, 2))?;
assert_eq!(list.extract::<Vec<u8>>()?, [1, 2, 3, 4]);
Ok(())
})?;
This is equivalent to the following Python code:
list_ = [1,3,4]
list_.insert(1,2)
assert list_ == [1,2,3,4]
sourcepub fn is_true(&self) -> Result<bool, PyErr>
pub fn is_true(&self) -> Result<bool, PyErr>
Returns whether the object is considered to be true.
This is equivalent to the Python expression bool(self)
.
sourcepub fn is_none(&self) -> bool
pub fn is_none(&self) -> bool
Returns whether the object is considered to be None.
This is equivalent to the Python expression self is None
.
sourcepub fn is_empty(&self) -> Result<bool, PyErr>
pub fn is_empty(&self) -> Result<bool, PyErr>
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) -> Result<&PyAny, PyErr> where
K: ToBorrowedObject,
pub fn get_item<K>(&self, key: K) -> Result<&PyAny, PyErr> where
K: ToBorrowedObject,
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) -> Result<(), PyErr> where
K: ToBorrowedObject,
V: ToBorrowedObject,
pub fn set_item<K, V>(&self, key: K, value: V) -> Result<(), PyErr> where
K: ToBorrowedObject,
V: ToBorrowedObject,
Sets a collection item value.
This is equivalent to the Python expression self[key] = value
.
sourcepub fn del_item<K>(&self, key: K) -> Result<(), PyErr> where
K: ToBorrowedObject,
pub fn del_item<K>(&self, key: K) -> Result<(), PyErr> where
K: ToBorrowedObject,
Deletes an item from the collection.
This is equivalent to the Python expression del self[key]
.
sourcepub fn iter(&self) -> Result<&PyIterator, PyErr>
pub fn iter(&self) -> Result<&PyIterator, PyErr>
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_ptr(&self) -> *mut PyTypeObject
pub fn get_type_ptr(&self) -> *mut PyTypeObject
Returns the Python type pointer for this object.
sourcepub fn cast_as<'a, D>(&'a self) -> Result<&'a D, PyDowncastError<'a>> where
D: PyTryFrom<'a>,
pub fn cast_as<'a, D>(&'a self) -> Result<&'a D, PyDowncastError<'a>> where
D: PyTryFrom<'a>,
Casts the PyObject to a concrete Python object type.
This can cast only to native Python types, not types implemented in Rust.
sourcepub fn extract<'a, D>(&'a self) -> Result<D, PyErr> where
D: FromPyObject<'a>,
pub fn extract<'a, D>(&'a self) -> Result<D, PyErr> where
D: FromPyObject<'a>,
Extracts some type from the Python object.
This is a wrapper function around FromPyObject::extract()
.
sourcepub fn get_refcnt(&self) -> isize
pub fn get_refcnt(&self) -> isize
Returns the reference count for the Python object.
sourcepub fn repr(&self) -> Result<&PyString, PyErr>
pub fn repr(&self) -> Result<&PyString, PyErr>
Computes the “repr” representation of self.
This is equivalent to the Python expression repr(self)
.
sourcepub fn str(&self) -> Result<&PyString, PyErr>
pub fn str(&self) -> Result<&PyString, PyErr>
Computes the “str” representation of self.
This is equivalent to the Python expression str(self)
.
sourcepub fn hash(&self) -> Result<isize, PyErr>
pub fn hash(&self) -> Result<isize, PyErr>
Retrieves the hash code of self.
This is equivalent to the Python expression hash(self)
.
sourcepub fn len(&self) -> Result<usize, PyErr>
pub fn len(&self) -> Result<usize, PyErr>
Returns the length of the sequence or mapping.
This is equivalent to the Python expression len(self)
.
sourcepub fn dir(&self) -> &PyList
pub fn dir(&self) -> &PyList
Returns the list of attributes of this object.
This is equivalent to the Python expression dir(self)
.
sourcepub fn is_instance(&self, typ: &PyType) -> Result<bool, PyErr>
pub fn is_instance(&self, typ: &PyType) -> Result<bool, PyErr>
Checks whether this object is an instance of type typ
.
This is equivalent to the Python expression isinstance(self, typ)
.
sourcepub fn is_instance_of<T>(&self) -> Result<bool, PyErr> where
T: PyTypeObject,
pub fn is_instance_of<T>(&self) -> Result<bool, PyErr> where
T: PyTypeObject,
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.
Trait Implementations
sourceimpl<'py, T, D> AsRef<PyArray<T, D>> for PyReadonlyArray<'py, T, D>
impl<'py, T, D> AsRef<PyArray<T, D>> for PyReadonlyArray<'py, T, D>
sourceimpl<'py, T, D> Deref for PyReadonlyArray<'py, T, D>
impl<'py, T, D> Deref for PyReadonlyArray<'py, T, D>
sourceimpl<'py, T, D> Drop for PyReadonlyArray<'py, T, D>
impl<'py, T, D> Drop for PyReadonlyArray<'py, T, D>
sourceimpl<'py, T, D> From<&'py PyArray<T, D>> for PyReadonlyArray<'py, T, D>
impl<'py, T, D> From<&'py PyArray<T, D>> for PyReadonlyArray<'py, T, D>
sourcefn from(array: &'py PyArray<T, D>) -> PyReadonlyArray<'py, T, D>
fn from(array: &'py PyArray<T, D>) -> PyReadonlyArray<'py, T, D>
Performs the conversion.
sourceimpl<'py, T: Element, D: Dimension> FromPyObject<'py> for PyReadonlyArray<'py, T, D>
impl<'py, T: Element, D: Dimension> FromPyObject<'py> for PyReadonlyArray<'py, T, D>
Auto Trait Implementations
impl<'py, T, D> !RefUnwindSafe for PyReadonlyArray<'py, T, D>
impl<'py, T, D> !Send for PyReadonlyArray<'py, T, D>
impl<'py, T, D> !Sync for PyReadonlyArray<'py, T, D>
impl<'py, T, D> Unpin for PyReadonlyArray<'py, T, D>
impl<'py, T, D> !UnwindSafe for PyReadonlyArray<'py, T, D>
Blanket Implementations
sourceimpl<T> BorrowMut<T> for T where
T: ?Sized,
impl<T> BorrowMut<T> for T where
T: ?Sized,
const: unstable · sourcefn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more