diff --git a/README.md b/README.md index 552494fc9..62a86f893 100644 --- a/README.md +++ b/README.md @@ -85,7 +85,7 @@ mod rust_ext { ### Execute a Python program from Rust and get results -``` toml +```toml [package] name = "numpy-test" @@ -96,7 +96,7 @@ numpy = "0.29" ```rust use numpy::{PyArray1, PyArrayMethods}; -use pyo3::{types::{IntoPyDict, PyAnyMethods}, PyResult, Python, ffi::c_str}; +use pyo3::{types::{IntoPyDict, PyAnyMethods}, PyResult, Python}; fn main() -> PyResult<()> { Python::attach(|py| { @@ -104,7 +104,7 @@ fn main() -> PyResult<()> { let locals = [("np", np)].into_py_dict(py)?; let pyarray = py - .eval(c_str!("np.absolute(np.array([-1, -2, -3], dtype='int32'))"), Some(&locals), None)? + .eval(c"np.absolute(np.array([-1, -2, -3], dtype='int32'))", Some(&locals), None)? .cast_into::>()?; let readonly = pyarray.readonly(); diff --git a/benches/array_like.rs b/benches/array_like.rs index 80f108259..033783bb1 100644 --- a/benches/array_like.rs +++ b/benches/array_like.rs @@ -3,7 +3,6 @@ use std::hint::black_box; use criterion::{criterion_group, criterion_main, BenchmarkId, Criterion, Throughput}; use numpy::{PyArrayLike1, PyArrayLike2, PyArrayLike3}; use pyo3::{ - ffi::c_str, types::{PyAnyMethods, PyDict}, Python, }; @@ -18,11 +17,7 @@ fn extract_array_like_1(c: &mut Criterion) { locals.set_item("size", size).unwrap(); let list = py - .eval( - c_str!("[float(i) for i in range(size)]"), - Some(&locals), - None, - ) + .eval(c"[float(i) for i in range(size)]", Some(&locals), None) .unwrap(); group.throughput(Throughput::Elements(size as u64)); @@ -48,7 +43,7 @@ fn extract_array_like_2(c: &mut Criterion) { let list = py .eval( - c_str!("[[float(i + j) for i in range(size)] for j in range(size)]"), + c"[[float(i + j) for i in range(size)] for j in range(size)]", Some(&locals), None, ) @@ -77,7 +72,7 @@ fn extract_array_like_3(c: &mut Criterion) { let list = py .eval( - c_str!("[[[float(i + j + k) for i in range(size)] for j in range(size)] for k in range(size)]"), + c"[[[float(i + j + k) for i in range(size)] for j in range(size)] for k in range(size)]", Some(&locals), None, ) diff --git a/src/array.rs b/src/array.rs index bf05911d5..fec289830 100644 --- a/src/array.rs +++ b/src/array.rs @@ -953,12 +953,12 @@ pub trait PyArrayMethods<'py, T, D>: PyUntypedArrayMethods<'py> + Sized { /// /// ``` /// use numpy::{PyArray2, PyArrayMethods}; - /// use pyo3::{Python, types::PyAnyMethods, ffi::c_str}; + /// use pyo3::{Python, types::PyAnyMethods}; /// /// # fn main() -> pyo3::PyResult<()> { /// Python::attach(|py| { /// let pyarray= py - /// .eval(c_str!("__import__('numpy').array([[0, 1], [2, 3]], dtype='int64')"), None, None)? + /// .eval(c"__import__('numpy').array([[0, 1], [2, 3]], dtype='int64')", None, None)? /// .cast_into::>()?; /// /// assert_eq!(pyarray.to_vec()?, vec![0, 1, 2, 3]); diff --git a/src/borrow/mod.rs b/src/borrow/mod.rs index 6e3b53d7c..4f8136e47 100644 --- a/src/borrow/mod.rs +++ b/src/borrow/mod.rs @@ -63,17 +63,17 @@ //! //! ```rust //! use numpy::{PyArray1, PyArrayMethods}; -//! use pyo3::{types::{IntoPyDict, PyAnyMethods}, Python, ffi::c_str}; +//! use pyo3::{types::{IntoPyDict, PyAnyMethods}, Python}; //! //! # fn main() -> pyo3::PyResult<()> { //! Python::attach(|py| { //! let array = PyArray1::arange(py, 0.0, 10.0, 1.0); //! let locals = [("array", array)].into_py_dict(py)?; //! -//! let view1 = py.eval(c_str!("array[:5]"), None, Some(&locals))?.cast_into::>()?; -//! let view2 = py.eval(c_str!("array[5:]"), None, Some(&locals))?.cast_into::>()?; -//! let view3 = py.eval(c_str!("array[::2]"), None, Some(&locals))?.cast_into::>()?; -//! let view4 = py.eval(c_str!("array[1::2]"), None, Some(&locals))?.cast_into::>()?; +//! let view1 = py.eval(c"array[:5]", None, Some(&locals))?.cast_into::>()?; +//! let view2 = py.eval(c"array[5:]", None, Some(&locals))?.cast_into::>()?; +//! let view3 = py.eval(c"array[::2]", None, Some(&locals))?.cast_into::>()?; +//! let view4 = py.eval(c"array[1::2]", None, Some(&locals))?.cast_into::>()?; //! //! { //! let _view1 = view1.readwrite(); @@ -95,15 +95,15 @@ //! # use std::panic::{catch_unwind, AssertUnwindSafe}; //! # //! use numpy::{PyArray2, PyArrayMethods}; -//! use pyo3::{types::{IntoPyDict, PyAnyMethods}, Python, ffi::c_str}; +//! use pyo3::{types::{IntoPyDict, PyAnyMethods}, Python}; //! //! # fn main() -> pyo3::PyResult<()> { //! Python::attach(|py| { //! let array = PyArray2::::zeros(py, (10, 10), false); //! let locals = [("array", array)].into_py_dict(py)?; //! -//! let view1 = py.eval(c_str!("array[:, ::3]"), None, Some(&locals))?.cast_into::>()?; -//! let view2 = py.eval(c_str!("array[:, 1::3]"), None, Some(&locals))?.cast_into::>()?; +//! let view1 = py.eval(c"array[:, ::3]", None, Some(&locals))?.cast_into::>()?; +//! let view2 = py.eval(c"array[:, 1::3]", None, Some(&locals))?.cast_into::>()?; //! //! // A false conflict as the views do not actually share any elements. //! let res = catch_unwind(AssertUnwindSafe(|| { @@ -300,7 +300,7 @@ where /// /// ```rust /// # use pyo3::prelude::*; - /// use pyo3::{py_run, ffi::c_str}; + /// use pyo3::py_run; /// use numpy::{get_array_module, PyReadonlyArray2}; /// use nalgebra::{MatrixView, Const, Dyn}; /// @@ -318,7 +318,7 @@ where /// /// # fn main() -> pyo3::PyResult<()> { /// Python::attach(|py| { - /// let np = py.eval(c_str!("__import__('numpy')"), None, None)?; + /// let np = py.eval(c"__import__('numpy')", None, None)?; /// let sum_standard_layout = wrap_pyfunction!(sum_standard_layout)(py)?; /// let sum_dynamic_strides = wrap_pyfunction!(sum_dynamic_strides)(py)?; /// @@ -682,7 +682,6 @@ mod tests { }; use crate::array::PyArray1; - use pyo3::ffi::c_str; #[test] fn test_debug_formatting() { @@ -728,7 +727,7 @@ mod tests { // The view will make the internal reference check of `PyArray_Resize` fail. let locals = [("array", &array)].into_py_dict(py).unwrap(); let _view = py - .eval(c_str!("array[:]"), None, Some(&locals)) + .eval(c"array[:]", None, Some(&locals)) .unwrap() .cast_into::>() .unwrap(); diff --git a/src/borrow/shared.rs b/src/borrow/shared.rs index bdbfa6d84..9ab5a8ce0 100644 --- a/src/borrow/shared.rs +++ b/src/borrow/shared.rs @@ -6,7 +6,6 @@ use std::slice::from_raw_parts; use std::sync::Mutex; use num_integer::gcd; -use pyo3::ffi::c_str; use pyo3::sync::PyOnceLock; use pyo3::types::{PyAnyMethods, PyCapsuleMethods}; use pyo3::{exceptions::PyTypeError, types::PyCapsule, PyResult, Python}; @@ -154,7 +153,7 @@ fn insert_shared<'py>(py: Python<'py>) -> PyResult> { // SAFETY: All versions of the shared borrow checking API start with a version field. let version = unsafe { *capsule - .pointer_checked(Some(c_str!("_RUST_NUMPY_BORROW_CHECKING_API")))? + .pointer_checked(Some(c"_RUST_NUMPY_BORROW_CHECKING_API"))? .cast::() .as_ptr() // FIXME(icxolu): use read on MSRV 1.80 }; @@ -164,7 +163,7 @@ fn insert_shared<'py>(py: Python<'py>) -> PyResult> { ))); } - let ptr = capsule.pointer_checked(Some(c_str!("_RUST_NUMPY_BORROW_CHECKING_API")))?; + let ptr = capsule.pointer_checked(Some(c"_RUST_NUMPY_BORROW_CHECKING_API"))?; // Intentionally leak a reference to the capsule // so we can safely cache a pointer into its interior. @@ -455,7 +454,6 @@ mod tests { use crate::array::{PyArray, PyArray1, PyArray2, PyArray3, PyArrayMethods}; use crate::convert::IntoPyArray; use crate::untyped_array::PyUntypedArrayMethods; - use pyo3::ffi::c_str; struct BorrowFlagsState { #[cfg(not(Py_GIL_DISABLED))] @@ -535,7 +533,7 @@ mod tests { let locals = [("array", &array)].into_py_dict(py).unwrap(); let view = py - .eval(c_str!("array[:,:,0]"), None, Some(&locals)) + .eval(c"array[:,:,0]", None, Some(&locals)) .unwrap() .cast_into::>() .unwrap(); @@ -564,7 +562,7 @@ mod tests { let locals = [("array", &array)].into_py_dict(py).unwrap(); let view = py - .eval(c_str!("array[:,:,0]"), None, Some(&locals)) + .eval(c"array[:,:,0]", None, Some(&locals)) .unwrap() .cast_into::>() .unwrap(); @@ -599,7 +597,7 @@ mod tests { let locals = [("array", &array)].into_py_dict(py).unwrap(); let view1 = py - .eval(c_str!("array[:,:,0]"), None, Some(&locals)) + .eval(c"array[:,:,0]", None, Some(&locals)) .unwrap() .cast_into::>() .unwrap(); @@ -610,7 +608,7 @@ mod tests { let locals = [("view1", &view1)].into_py_dict(py).unwrap(); let view2 = py - .eval(c_str!("view1[:,0]"), None, Some(&locals)) + .eval(c"view1[:,0]", None, Some(&locals)) .unwrap() .cast_into::>() .unwrap(); @@ -647,7 +645,7 @@ mod tests { let locals = [("array", &array)].into_py_dict(py).unwrap(); let view1 = py - .eval(c_str!("array[:,:,0]"), None, Some(&locals)) + .eval(c"array[:,:,0]", None, Some(&locals)) .unwrap() .cast_into::>() .unwrap(); @@ -658,7 +656,7 @@ mod tests { let locals = [("view1", &view1)].into_py_dict(py).unwrap(); let view2 = py - .eval(c_str!("view1[:,0]"), None, Some(&locals)) + .eval(c"view1[:,0]", None, Some(&locals)) .unwrap() .cast_into::>() .unwrap(); @@ -701,7 +699,7 @@ mod tests { let locals = [("array", &array)].into_py_dict(py).unwrap(); let view = py - .eval(c_str!("array[::-1,:,::-1]"), None, Some(&locals)) + .eval(c"array[::-1,:,::-1]", None, Some(&locals)) .unwrap() .cast_into::>() .unwrap(); @@ -750,7 +748,7 @@ mod tests { let locals = [("array", array)].into_py_dict(py).unwrap(); let view1 = py - .eval(c_str!("array[:,::3]"), None, Some(&locals)) + .eval(c"array[:,::3]", None, Some(&locals)) .unwrap() .cast_into::>() .unwrap(); @@ -761,7 +759,7 @@ mod tests { assert_eq!(key1.gcd_strides, 8); let view2 = py - .eval(c_str!("array[:,1::3]"), None, Some(&locals)) + .eval(c"array[:,1::3]", None, Some(&locals)) .unwrap() .cast_into::>() .unwrap(); @@ -772,7 +770,7 @@ mod tests { assert_eq!(key2.gcd_strides, 8); let view3 = py - .eval(c_str!("array[:,::2]"), None, Some(&locals)) + .eval(c"array[:,::2]", None, Some(&locals)) .unwrap() .cast_into::>() .unwrap(); @@ -783,7 +781,7 @@ mod tests { assert_eq!(key3.gcd_strides, 16); let view4 = py - .eval(c_str!("array[:,1::2]"), None, Some(&locals)) + .eval(c"array[:,1::2]", None, Some(&locals)) .unwrap() .cast_into::>() .unwrap(); @@ -852,7 +850,7 @@ mod tests { let locals = [("array", array)].into_py_dict(py).unwrap(); let view1 = py - .eval(c_str!("array[:5]"), None, Some(&locals)) + .eval(c"array[:5]", None, Some(&locals)) .unwrap() .cast_into::>() .unwrap(); @@ -871,7 +869,7 @@ mod tests { } let view2 = py - .eval(c_str!("array[5:]"), None, Some(&locals)) + .eval(c"array[5:]", None, Some(&locals)) .unwrap() .cast_into::>() .unwrap(); @@ -892,7 +890,7 @@ mod tests { } let view3 = py - .eval(c_str!("array[5:]"), None, Some(&locals)) + .eval(c"array[5:]", None, Some(&locals)) .unwrap() .cast_into::>() .unwrap(); @@ -916,7 +914,7 @@ mod tests { } let view4 = py - .eval(c_str!("array[7:]"), None, Some(&locals)) + .eval(c"array[7:]", None, Some(&locals)) .unwrap() .cast_into::>() .unwrap(); diff --git a/src/datetime.rs b/src/datetime.rs index 8c1a20d8e..e484a5671 100644 --- a/src/datetime.rs +++ b/src/datetime.rs @@ -11,18 +11,18 @@ //! //! ``` //! use numpy::{datetime::{units, Datetime, Timedelta}, PyArray1, PyArrayMethods}; -//! use pyo3::{Python, types::PyAnyMethods, ffi::c_str}; +//! use pyo3::{Python, types::PyAnyMethods}; //! # use pyo3::types::PyDict; //! //! # fn main() -> pyo3::PyResult<()> { //! Python::attach(|py| { //! # let locals = py -//! # .eval(c_str!("{ 'np': __import__('numpy') }"), None, None)? +//! # .eval(c"{ 'np': __import__('numpy') }", None, None)? //! # .cast_into::()?; //! # //! let array = py //! .eval( -//! c_str!("np.array([np.datetime64('2017-04-21')])"), +//! c"np.array([np.datetime64('2017-04-21')])", //! None, //! Some(&locals), //! )? @@ -35,7 +35,7 @@ //! //! let array = py //! .eval( -//! c_str!("np.array([np.datetime64('2022-03-29')]) - np.array([np.datetime64('2017-04-21')])"), +//! c"np.array([np.datetime64('2022-03-29')]) - np.array([np.datetime64('2017-04-21')])", //! None, //! Some(&locals), //! )? @@ -256,7 +256,6 @@ mod tests { use super::*; use pyo3::{ - ffi::c_str, py_run, types::{PyDict, PyModule}, }; @@ -267,14 +266,14 @@ mod tests { fn from_python_to_rust() { Python::attach(|py| { let locals = py - .eval(c_str!("{ 'np': __import__('numpy') }"), None, None) + .eval(c"{ 'np': __import__('numpy') }", None, None) .unwrap() .cast_into::() .unwrap(); let array = py .eval( - c_str!("np.array([np.datetime64('1970-01-01')])"), + c"np.array([np.datetime64('1970-01-01')])", None, Some(&locals), ) @@ -295,7 +294,7 @@ mod tests { *array.readwrite().get_mut(0).unwrap() = Timedelta::::from(5); let np = py - .eval(c_str!("__import__('numpy')"), None, None) + .eval(c"__import__('numpy')", None, None) .unwrap() .cast_into::() .unwrap(); diff --git a/src/dtype.rs b/src/dtype.rs index 416783a75..c5ec13d80 100644 --- a/src/dtype.rs +++ b/src/dtype.rs @@ -30,14 +30,14 @@ pub use num_complex::{Complex32, Complex64}; /// /// ``` /// use numpy::{dtype, get_array_module, PyArrayDescr, PyArrayDescrMethods}; -/// use numpy::pyo3::{types::{IntoPyDict, PyAnyMethods}, Python, ffi::c_str}; +/// use numpy::pyo3::{types::{IntoPyDict, PyAnyMethods}, Python}; /// /// # fn main() -> pyo3::PyResult<()> { /// Python::attach(|py| { /// let locals = [("np", get_array_module(py)?)].into_py_dict(py)?; /// /// let dt = py -/// .eval(c_str!("np.array([1, 2, 3.0]).dtype"), Some(&locals), None)? +/// .eval(c"np.array([1, 2, 3.0]).dtype", Some(&locals), None)? /// .cast_into::()?; /// /// assert!(dt.is_equiv_to(&dtype::(py))); diff --git a/src/random.rs b/src/random.rs index 79bc86bb6..df314236c 100644 --- a/src/random.rs +++ b/src/random.rs @@ -252,7 +252,7 @@ impl BitGenerator { .getattr(intern!(py, "capsule"))? .cast_into::()?; let raw = capsule - .pointer_checked(Some(ffi::c_str!("BitGenerator"))) + .pointer_checked(Some(c"BitGenerator")) .map_err(|_| PyRuntimeError::new_err("Invalid BitGenerator capsule"))?; Ok(BitGenerator { raw: raw.cast(), diff --git a/src/untyped_array.rs b/src/untyped_array.rs index 16d7d0f2b..f7716ab33 100644 --- a/src/untyped_array.rs +++ b/src/untyped_array.rs @@ -112,7 +112,7 @@ pub trait PyUntypedArrayMethods<'py>: Sealed { /// /// ``` /// use numpy::{PyArray1, PyUntypedArrayMethods}; - /// use pyo3::{types::{IntoPyDict, PyAnyMethods}, Python, ffi::c_str}; + /// use pyo3::{types::{IntoPyDict, PyAnyMethods}, Python}; /// /// # fn main() -> pyo3::PyResult<()> { /// Python::attach(|py| { @@ -121,7 +121,7 @@ pub trait PyUntypedArrayMethods<'py>: Sealed { /// /// let view = py /// .eval( - /// c_str!("array.view('u1')[1:-1].view('u2')"), + /// c"array.view('u1')[1:-1].view('u2')", /// None, /// Some(&[("array", array)].into_py_dict(py)?), /// )? @@ -142,7 +142,7 @@ pub trait PyUntypedArrayMethods<'py>: Sealed { /// /// ``` /// use numpy::{PyArray1, PyUntypedArrayMethods}; - /// use pyo3::{types::{IntoPyDict, PyAnyMethods}, Python, ffi::c_str}; + /// use pyo3::{types::{IntoPyDict, PyAnyMethods}, Python}; /// /// # fn main() -> pyo3::PyResult<()> { /// Python::attach(|py| { @@ -150,7 +150,7 @@ pub trait PyUntypedArrayMethods<'py>: Sealed { /// assert!(array.is_contiguous()); /// /// let view = py - /// .eval(c_str!("array[::2]"), None, Some(&[("array", array)].into_py_dict(py)?))? + /// .eval(c"array[::2]", None, Some(&[("array", array)].into_py_dict(py)?))? /// .cast_into::>()?; /// assert!(!view.is_contiguous()); /// # Ok(()) diff --git a/tests/array.rs b/tests/array.rs index 54a35673c..2441be0f9 100644 --- a/tests/array.rs +++ b/tests/array.rs @@ -8,7 +8,6 @@ use numpy::{ dtype, get_array_module, npyffi::NPY_ORDER, pyarray, PyArray, PyArray1, PyArray2, PyArrayDescr, PyFixedString, PyFixedUnicode, }; -use pyo3::ffi::c_str; use pyo3::{ py_run, pyclass, pymethods, types::{IntoPyDict, PyAnyMethods, PyDict, PyList}, @@ -23,7 +22,7 @@ fn get_np_locals(py: Python<'_>) -> Bound<'_, PyDict> { fn not_contiguous_array(py: Python<'_>) -> Bound<'_, PyArray1> { py.eval( - c_str!("np.array([1, 2, 3, 4], dtype='int32')[::2]"), + c"np.array([1, 2, 3, 4], dtype='int32')[::2]", None, Some(&get_np_locals(py)), ) @@ -34,7 +33,7 @@ fn not_contiguous_array(py: Python<'_>) -> Bound<'_, PyArray1> { fn not_aligned_array(py: Python<'_>) -> Bound<'_, PyArray1> { py.eval( - c_str!("np.zeros(8, dtype='u2').view('u1')[1:-1].view('u2')"), + c"np.zeros(8, dtype='u2').view('u1')[1:-1].view('u2')", None, Some(&get_np_locals(py)), ) @@ -218,7 +217,7 @@ fn as_slice() { let misaligned_empty: Bound<'_, PyArray1> = { let arr = not_aligned_array(py); py.eval( - c_str!("arr[0:0]"), + c"arr[0:0]", None, Some(&[("arr", arr)].into_py_dict(py).unwrap()), ) @@ -272,9 +271,7 @@ fn cast_exact_checks_dtype_and_shape() { // cast_exact should reject subclasses of ndarray; cast should accept them let masked = py .eval( - pyo3::ffi::c_str!( - "__import__('numpy').ma.MaskedArray([[1.0, 2.0], [3.0, 4.0]], dtype='float64')" - ), + c"__import__('numpy').ma.MaskedArray([[1.0, 2.0], [3.0, 4.0]], dtype='float64')", None, None, ) @@ -370,7 +367,7 @@ fn handle_negative_strides() { let neg_str_pyarr = py .eval( - c_str!("a[::-1]"), + c"a[::-1]", Some(&[("a", pyarr)].into_py_dict(py).unwrap()), None, ) @@ -393,7 +390,7 @@ fn dtype_via_python_attribute() { let dt = py .eval( - c_str!("a.dtype"), + c"a.dtype", Some(&[("a", pyarr)].into_py_dict(py).unwrap()), None, ) @@ -566,12 +563,12 @@ fn reshape() { #[test] fn half_f16_works() { Python::attach(|py| { - let np = py.eval(c_str!("__import__('numpy')"), None, None).unwrap(); + let np = py.eval(c"__import__('numpy')", None, None).unwrap(); let locals = [("np", &np)].into_py_dict(py).unwrap(); let array = py .eval( - c_str!("np.array([[1, 2], [3, 4]], dtype='float16')"), + c"np.array([[1, 2], [3, 4]], dtype='float16')", None, Some(&locals), ) @@ -604,17 +601,15 @@ fn half_f16_works() { #[test] fn half_bf16_works() { Python::attach(|py| { - let np = py.eval(c_str!("__import__('numpy')"), None, None).unwrap(); + let np = py.eval(c"__import__('numpy')", None, None).unwrap(); // NumPy itself does not provide a `bfloat16` dtype itself, // so we import ml_dtypes which does register such a dtype. - let mldt = py - .eval(c_str!("__import__('ml_dtypes')"), None, None) - .unwrap(); + let mldt = py.eval(c"__import__('ml_dtypes')", None, None).unwrap(); let locals = [("np", &np), ("mldt", &mldt)].into_py_dict(py).unwrap(); let array = py .eval( - c_str!("np.array([[1, 2], [3, 4]], dtype='bfloat16')"), + c"np.array([[1, 2], [3, 4]], dtype='bfloat16')", None, Some(&locals), ) @@ -646,12 +641,12 @@ fn half_bf16_works() { #[test] fn ascii_strings_with_explicit_dtype_works() { Python::attach(|py| { - let np = py.eval(c_str!("__import__('numpy')"), None, None).unwrap(); + let np = py.eval(c"__import__('numpy')", None, None).unwrap(); let locals = [("np", &np)].into_py_dict(py).unwrap(); let array = py .eval( - c_str!("np.array([b'foo', b'bar', b'foobar'], dtype='S6')"), + c"np.array([b'foo', b'bar', b'foobar'], dtype='S6')", None, Some(&locals), ) @@ -682,12 +677,12 @@ fn ascii_strings_with_explicit_dtype_works() { #[test] fn unicode_strings_with_explicit_dtype_works() { Python::attach(|py| { - let np = py.eval(c_str!("__import__('numpy')"), None, None).unwrap(); + let np = py.eval(c"__import__('numpy')", None, None).unwrap(); let locals = [("np", &np)].into_py_dict(py).unwrap(); let array = py .eval( - c_str!("np.array(['foo', 'bar', 'foobar'], dtype='U6')"), + c"np.array(['foo', 'bar', 'foobar'], dtype='U6')", None, Some(&locals), ) @@ -728,12 +723,12 @@ fn unicode_strings_with_explicit_dtype_works() { #[test] fn ascii_strings_ignore_byteorder() { Python::attach(|py| { - let np = py.eval(c_str!("__import__('numpy')"), None, None).unwrap(); + let np = py.eval(c"__import__('numpy')", None, None).unwrap(); let locals = [("np", &np)].into_py_dict(py).unwrap(); let native_endian_works = py .eval( - c_str!("np.array([b'foo', b'bar'], dtype='=S3')"), + c"np.array([b'foo', b'bar'], dtype='=S3')", None, Some(&locals), ) @@ -743,7 +738,7 @@ fn ascii_strings_ignore_byteorder() { let little_endian_works = py .eval( - c_str!("np.array(['bfoo', b'bar'], dtype='>().unwrap(); assert_eq!(array![[1.0, 2.0], [3.0, 4.0]], extracted_array.as_array()); @@ -74,11 +71,7 @@ fn convert_array_in_list_on_extract() { Python::attach(|py| { let locals = get_np_locals(py); let py_array = py - .eval( - c_str!("[np.array([1.0, 2.0]), [3.0, 4.0]]"), - Some(&locals), - None, - ) + .eval(c"[np.array([1.0, 2.0]), [3.0, 4.0]]", Some(&locals), None) .unwrap(); let extracted_array = py_array.extract::>().unwrap(); @@ -90,7 +83,7 @@ fn convert_array_in_list_on_extract() { fn convert_list_on_extract_dyn() { Python::attach(|py| { let py_list = py - .eval(c_str!("[[[1,2],[3,4]],[[5,6],[7,8]]]"), None, None) + .eval(c"[[[1,2],[3,4]],[[5,6],[7,8]]]", None, None) .unwrap(); let extracted_array = py_list .extract::>() @@ -106,7 +99,7 @@ fn convert_list_on_extract_dyn() { #[test] fn convert_1d_list_on_extract() { Python::attach(|py| { - let py_list = py.eval(c_str!("[1,2,3,4]"), None, None).unwrap(); + let py_list = py.eval(c"[1,2,3,4]", None, None).unwrap(); let extracted_array_1d = py_list.extract::>().unwrap(); let extracted_array_dyn = py_list.extract::>().unwrap(); @@ -124,7 +117,7 @@ fn preserve_trailing_singleton_dims() { let locals = get_np_locals(py); let py_array = py .eval( - c_str!("np.array([[1], [2], [3]], dtype='int32')"), + c"np.array([[1], [2], [3]], dtype='int32')", Some(&locals), None, ) @@ -143,7 +136,7 @@ fn unsafe_cast_shall_fail() { let locals = get_np_locals(py); let py_list = py .eval( - c_str!("np.array([1.1,2.2,3.3,4.4], dtype='float64')"), + c"np.array([1.1,2.2,3.3,4.4], dtype='float64')", Some(&locals), None, ) @@ -160,7 +153,7 @@ fn extract_1d_array_of_different_float_types_fail() { let locals = get_np_locals(py); let py_list = py .eval( - c_str!("np.array([1, 2, 3, 4], dtype='float64')"), + c"np.array([1, 2, 3, 4], dtype='float64')", Some(&locals), None, ) @@ -182,7 +175,7 @@ fn extract_2d_array_of_different_float_types_fail() { let locals = get_np_locals(py); let py_list = py .eval( - c_str!("np.array([[1, 2], [3, 4]], dtype='float64')"), + c"np.array([[1, 2], [3, 4]], dtype='float64')", Some(&locals), None, ) @@ -204,7 +197,7 @@ fn unsafe_cast_with_coerce_works() { let locals = get_np_locals(py); let py_list = py .eval( - c_str!("np.array([1.1,2.2,3.3,4.4], dtype='float64')"), + c"np.array([1.1,2.2,3.3,4.4], dtype='float64')", Some(&locals), None, ) diff --git a/tests/borrow.rs b/tests/borrow.rs index c36cfd168..5e121eb81 100644 --- a/tests/borrow.rs +++ b/tests/borrow.rs @@ -6,7 +6,6 @@ use numpy::{ PyArray, PyArray1, PyArray2, PyReadonlyArray3, PyReadwriteArray3, PyUntypedArrayMethods, }; use pyo3::{ - ffi::c_str, pyclass, pymethods, types::{IntoPyDict, PyAnyMethods}, Py, Python, @@ -160,14 +159,14 @@ fn overlapping_views_conflict() { let locals = [("array", array)].into_py_dict(py).unwrap(); let view1 = py - .eval(c_str!("array[0,0,0:2]"), None, Some(&locals)) + .eval(c"array[0,0,0:2]", None, Some(&locals)) .unwrap() .cast_into::>() .unwrap(); assert_eq!(view1.shape(), [2]); let view2 = py - .eval(c_str!("array[0,0,1:3]"), None, Some(&locals)) + .eval(c"array[0,0,1:3]", None, Some(&locals)) .unwrap() .cast_into::>() .unwrap(); @@ -185,14 +184,14 @@ fn non_overlapping_views_do_not_conflict() { let locals = [("array", array)].into_py_dict(py).unwrap(); let view1 = py - .eval(c_str!("array[0,0,0:1]"), None, Some(&locals)) + .eval(c"array[0,0,0:1]", None, Some(&locals)) .unwrap() .cast_into::>() .unwrap(); assert_eq!(view1.shape(), [1]); let view2 = py - .eval(c_str!("array[0,0,2:3]"), None, Some(&locals)) + .eval(c"array[0,0,2:3]", None, Some(&locals)) .unwrap() .cast_into::>() .unwrap(); @@ -214,14 +213,14 @@ fn conflict_due_to_overlapping_views() { let locals = [("array", array)].into_py_dict(py).unwrap(); let view1 = py - .eval(c_str!("array[0:2]"), None, Some(&locals)) + .eval(c"array[0:2]", None, Some(&locals)) .unwrap() .cast_into::>() .unwrap(); assert_eq!(view1.shape(), [2]); let view2 = py - .eval(c_str!("array[1:3]"), None, Some(&locals)) + .eval(c"array[1:3]", None, Some(&locals)) .unwrap() .cast_into::>() .unwrap(); @@ -240,14 +239,14 @@ fn conflict_due_to_reborrow_of_overlapping_views() { let locals = [("array", array)].into_py_dict(py).unwrap(); let view1 = py - .eval(c_str!("array[0:2]"), None, Some(&locals)) + .eval(c"array[0:2]", None, Some(&locals)) .unwrap() .cast_into::>() .unwrap(); assert_eq!(view1.shape(), [2]); let view2 = py - .eval(c_str!("array[1:3]"), None, Some(&locals)) + .eval(c"array[1:3]", None, Some(&locals)) .unwrap() .cast_into::>() .unwrap(); @@ -268,21 +267,21 @@ fn interleaved_views_do_not_conflict() { let locals = [("array", array)].into_py_dict(py).unwrap(); let view1 = py - .eval(c_str!("array[:,:,0]"), None, Some(&locals)) + .eval(c"array[:,:,0]", None, Some(&locals)) .unwrap() .cast_into::>() .unwrap(); assert_eq!(view1.shape(), [23, 42]); let view2 = py - .eval(c_str!("array[:,:,1]"), None, Some(&locals)) + .eval(c"array[:,:,1]", None, Some(&locals)) .unwrap() .cast_into::>() .unwrap(); assert_eq!(view2.shape(), [23, 42]); let view3 = py - .eval(c_str!("array[:,:,2]"), None, Some(&locals)) + .eval(c"array[:,:,2]", None, Some(&locals)) .unwrap() .cast_into::>() .unwrap(); @@ -362,11 +361,7 @@ fn can_make_python_array_nonwriteable() { let locals = [("array", &array)].into_py_dict(py).unwrap(); array.readwrite().make_nonwriteable(); assert!(!py - .eval( - pyo3::ffi::c_str!("array.flags.writeable"), - None, - Some(&locals) - ) + .eval(c"array.flags.writeable", None, Some(&locals)) .unwrap() .extract::() .unwrap()) @@ -453,7 +448,7 @@ fn matrix_from_numpy() { let array = numpy::pyarray![py, [0, 1, 2], [3, 4, 5], [6, 7, 8]]; let array = py .eval( - c_str!("a[::-1]"), + c"a[::-1]", Some(&[("a", array)].into_py_dict(py).unwrap()), None, ) @@ -471,7 +466,7 @@ fn matrix_from_numpy() { let array = numpy::pyarray![py, [[0, 1], [2, 3]], [[4, 5], [6, 7]]]; let array = py .eval( - c_str!("a[:,:,0]"), + c"a[:,:,0]", Some(&[("a", &array)].into_py_dict(py).unwrap()), None, ) @@ -495,7 +490,7 @@ fn matrix_from_numpy() { let array = numpy::pyarray![py, [[0, 1], [2, 3]], [[4, 5], [6, 7]]]; let array = py .eval( - c_str!("a[:,:,0]"), + c"a[:,:,0]", Some(&[("a", &array)].into_py_dict(py).unwrap()), None, )