|
63 | 63 | //! |
64 | 64 | //! ```rust |
65 | 65 | //! use numpy::{PyArray1, PyArrayMethods}; |
66 | | -//! use pyo3::{types::{IntoPyDict, PyAnyMethods}, Python}; |
| 66 | +//! use pyo3::{types::{IntoPyDict, PyAnyMethods}, Python, ffi::c_str}; |
67 | 67 | //! |
| 68 | +//! # fn main() -> pyo3::PyResult<()> { |
68 | 69 | //! Python::with_gil(|py| { |
69 | 70 | //! let array = PyArray1::arange(py, 0.0, 10.0, 1.0); |
70 | | -//! let locals = [("array", array)].into_py_dict(py).unwrap(); |
| 71 | +//! let locals = [("array", array)].into_py_dict(py)?; |
71 | 72 | //! |
72 | | -//! let view1 = py.eval("array[:5]", None, Some(&locals)).unwrap().downcast_into::<PyArray1<f64>>().unwrap(); |
73 | | -//! let view2 = py.eval("array[5:]", None, Some(&locals)).unwrap().downcast_into::<PyArray1<f64>>().unwrap(); |
74 | | -//! let view3 = py.eval("array[::2]", None, Some(&locals)).unwrap().downcast_into::<PyArray1<f64>>().unwrap(); |
75 | | -//! let view4 = py.eval("array[1::2]", None, Some(&locals)).unwrap().downcast_into::<PyArray1<f64>>().unwrap(); |
| 73 | +//! let view1 = py.eval(c_str!("array[:5]"), None, Some(&locals))?.downcast_into::<PyArray1<f64>>()?; |
| 74 | +//! let view2 = py.eval(c_str!("array[5:]"), None, Some(&locals))?.downcast_into::<PyArray1<f64>>()?; |
| 75 | +//! let view3 = py.eval(c_str!("array[::2]"), None, Some(&locals))?.downcast_into::<PyArray1<f64>>()?; |
| 76 | +//! let view4 = py.eval(c_str!("array[1::2]"), None, Some(&locals))?.downcast_into::<PyArray1<f64>>()?; |
76 | 77 | //! |
77 | 78 | //! { |
78 | 79 | //! let _view1 = view1.readwrite(); |
|
83 | 84 | //! let _view3 = view3.readwrite(); |
84 | 85 | //! let _view4 = view4.readwrite(); |
85 | 86 | //! } |
86 | | -//! }); |
| 87 | +//! # Ok(()) |
| 88 | +//! }) |
| 89 | +//! # } |
87 | 90 | //! ``` |
88 | 91 | //! |
89 | 92 | //! The third example shows that some views are incorrectly rejected since the borrows are over-approximated. |
|
92 | 95 | //! # use std::panic::{catch_unwind, AssertUnwindSafe}; |
93 | 96 | //! # |
94 | 97 | //! use numpy::{PyArray2, PyArrayMethods}; |
95 | | -//! use pyo3::{types::{IntoPyDict, PyAnyMethods}, Python}; |
| 98 | +//! use pyo3::{types::{IntoPyDict, PyAnyMethods}, Python, ffi::c_str}; |
96 | 99 | //! |
| 100 | +//! # fn main() -> pyo3::PyResult<()> { |
97 | 101 | //! Python::with_gil(|py| { |
98 | 102 | //! let array = PyArray2::<f64>::zeros(py, (10, 10), false); |
99 | | -//! let locals = [("array", array)].into_py_dict(py).unwrap(); |
| 103 | +//! let locals = [("array", array)].into_py_dict(py)?; |
100 | 104 | //! |
101 | | -//! let view1 = py.eval("array[:, ::3]", None, Some(&locals)).unwrap().downcast_into::<PyArray2<f64>>().unwrap(); |
102 | | -//! let view2 = py.eval("array[:, 1::3]", None, Some(&locals)).unwrap().downcast_into::<PyArray2<f64>>().unwrap(); |
| 105 | +//! let view1 = py.eval(c_str!("array[:, ::3]"), None, Some(&locals))?.downcast_into::<PyArray2<f64>>()?; |
| 106 | +//! let view2 = py.eval(c_str!("array[:, 1::3]"), None, Some(&locals))?.downcast_into::<PyArray2<f64>>()?; |
103 | 107 | //! |
104 | 108 | //! // A false conflict as the views do not actually share any elements. |
105 | 109 | //! let res = catch_unwind(AssertUnwindSafe(|| { |
106 | 110 | //! let _view1 = view1.readwrite(); |
107 | 111 | //! let _view2 = view2.readwrite(); |
108 | 112 | //! })); |
109 | 113 | //! assert!(res.is_err()); |
110 | | -//! }); |
| 114 | +//! # Ok(()) |
| 115 | +//! }) |
| 116 | +//! # } |
111 | 117 | //! ``` |
112 | 118 | //! |
113 | 119 | //! # Rationale |
|
0 commit comments