diff --git a/examples/rustapi_module/src/datetime.rs b/examples/rustapi_module/src/datetime.rs index 2b140297152..7485e3e4dec 100644 --- a/examples/rustapi_module/src/datetime.rs +++ b/examples/rustapi_module/src/datetime.rs @@ -38,7 +38,7 @@ fn make_time<'p>( minute, second, microsecond, - tzinfo.map(|o| o.to_object(py)), + tzinfo.map(|o| o.as_ref()), ) } @@ -59,7 +59,7 @@ fn time_with_fold<'p>( minute, second, microsecond, - tzinfo.map(|o| o.to_object(py)), + tzinfo.map(|o| o.as_ref()), fold, ) } @@ -135,7 +135,7 @@ fn make_datetime<'p>( minute, second, microsecond, - tzinfo.map(|o| (o.to_object(py))), + tzinfo.map(|o| o.as_ref()), ) } diff --git a/examples/rustapi_module/src/objstore.rs b/examples/rustapi_module/src/objstore.rs index d36bbe00224..9792de4ca59 100644 --- a/examples/rustapi_module/src/objstore.rs +++ b/examples/rustapi_module/src/objstore.rs @@ -13,8 +13,8 @@ impl ObjStore { ObjStore::default() } - fn push(&mut self, py: Python, obj: &PyObject) { - self.obj.push(obj.to_object(py).into()); + fn push(&mut self, obj: &PyObject) { + self.obj.push(obj.into()); } } diff --git a/src/derive_utils.rs b/src/derive_utils.rs index 3cee75b89d2..c68640e7636 100644 --- a/src/derive_utils.rs +++ b/src/derive_utils.rs @@ -6,7 +6,6 @@ use crate::err::{PyErr, PyResult}; use crate::exceptions::TypeError; -use crate::instance::PyNativeType; use crate::pyclass::PyClass; use crate::pyclass_init::PyClassInitializer; use crate::types::{PyDict, PyModule, PyObject, PyTuple}; @@ -98,9 +97,7 @@ pub fn parse_fn_args<'p>( } // Adjust the remaining args let args = if accept_args { - let py = args.py(); - let slice = args.slice(used_args as isize, nargs as isize); - py.checked_cast_as(slice.as_ref().into()).unwrap() + args.slice(used_args as isize, nargs as isize) } else { args }; diff --git a/src/ffi/setobject.rs b/src/ffi/setobject.rs index 8ad4b7cba46..6f9c832b4a6 100644 --- a/src/ffi/setobject.rs +++ b/src/ffi/setobject.rs @@ -41,14 +41,14 @@ pub unsafe fn PyFrozenSet_CheckExact(ob: *mut PyObject) -> c_int { } #[inline] -#[cfg_attr(PyPy, link_name = "PyPyObjectSet_CheckExact")] -pub unsafe fn PyObjectSet_CheckExact(ob: *mut PyObject) -> c_int { +#[cfg_attr(PyPy, link_name = "PyPyAnySet_CheckExact")] +pub unsafe fn PyAnySet_CheckExact(ob: *mut PyObject) -> c_int { (Py_TYPE(ob) == &mut PySet_Type || Py_TYPE(ob) == &mut PyFrozenSet_Type) as c_int } #[inline] -pub unsafe fn PyObjectSet_Check(ob: *mut PyObject) -> c_int { - (PyObjectSet_CheckExact(ob) != 0 +pub unsafe fn PyAnySet_Check(ob: *mut PyObject) -> c_int { + (PyAnySet_CheckExact(ob) != 0 || PyType_IsSubtype(Py_TYPE(ob), &mut PySet_Type) != 0 || PyType_IsSubtype(Py_TYPE(ob), &mut PyFrozenSet_Type) != 0) as c_int } diff --git a/src/instance.rs b/src/instance.rs index 066420eddec..07417be642f 100644 --- a/src/instance.rs +++ b/src/instance.rs @@ -278,7 +278,7 @@ impl Py { // } } -/// Retrieves `&'py` types from `Py` or `Py`. +/// Retrieves `&'py` types from `Py`. /// /// # Examples /// `Py::as_ref` returns `&PyDict`, `&PyList` or so for native types, and `&PyCell` diff --git a/src/objectprotocol.rs b/src/objectprotocol.rs index 38323fd381e..7841943b25b 100644 --- a/src/objectprotocol.rs +++ b/src/objectprotocol.rs @@ -497,14 +497,14 @@ mod test { use super::*; use crate::types::{IntoPyDict, PyString}; use crate::Python; - use crate::{PyTryFrom, ToPyObject}; + use crate::ToPyObject; #[test] fn test_debug_string() { let gil = Python::acquire_gil(); let py = gil.python(); let v = "Hello\n".to_object(py); - let s = ::try_from(v).unwrap(); + let s: &PyString = v.downcast().unwrap(); assert_eq!(format!("{:?}", s), "'Hello\\n'"); } @@ -513,7 +513,7 @@ mod test { let gil = Python::acquire_gil(); let py = gil.python(); let v = "Hello\n".to_object(py); - let s = ::try_from(v).unwrap(); + let s: &PyString = v.downcast().unwrap(); assert_eq!(format!("{}", s), "Hello\n"); } diff --git a/src/python.rs b/src/python.rs index 76cf20e90a7..e47c2ab4693 100644 --- a/src/python.rs +++ b/src/python.rs @@ -290,10 +290,10 @@ impl<'p> Python<'p> { /// Registers the object in the release pool, and tries to downcast to specific type. pub fn checked_cast_as(self, obj: Py) -> Result<&'p T, PyDowncastError> where - T: PyTryFrom<'p>, + T: for<'py> PyTryFrom<'py>, { let obj = unsafe { gil::register_owned(self, obj.into_non_null()) }; - ::try_from(obj) + obj.downcast() } /// Registers the object in the release pool, and does an unchecked downcast diff --git a/src/types/boolobject.rs b/src/types/boolobject.rs index d07287fe07a..8db9629bec6 100644 --- a/src/types/boolobject.rs +++ b/src/types/boolobject.rs @@ -1,7 +1,6 @@ // Copyright (c) 2017-present PyO3 Project and Contributors use crate::{ - ffi, AsPyPointer, FromPy, FromPyObject, IntoPy, Py, PyObject, PyResult, PyTryFrom, Python, - ToPyObject, + ffi, AsPyPointer, FromPy, FromPyObject, IntoPy, Py, PyObject, PyResult, Python, ToPyObject, }; /// Represents a Python `bool`. @@ -50,7 +49,7 @@ impl FromPy for Py { /// Fails with `TypeError` if the input is not a Python `bool`. impl<'source> FromPyObject<'source> for bool { fn extract(obj: &'source PyObject) -> PyResult { - Ok(::try_from(obj)?.is_true()) + Ok(obj.downcast::()?.is_true()) } } diff --git a/src/types/bytes.rs b/src/types/bytes.rs index 067fff1e750..00893bf9463 100644 --- a/src/types/bytes.rs +++ b/src/types/bytes.rs @@ -1,6 +1,4 @@ -use crate::{ - ffi, AsPyPointer, FromPy, FromPyObject, IntoPy, Py, PyObject, PyResult, PyTryFrom, Python, -}; +use crate::{ffi, AsPyPointer, FromPy, FromPyObject, IntoPy, Py, PyObject, PyResult, Python}; use std::ops::Index; use std::os::raw::c_char; use std::slice::SliceIndex; @@ -64,7 +62,7 @@ impl<'a> FromPy<&'a [u8]> for Py { impl<'a> FromPyObject<'a> for &'a [u8] { fn extract(obj: &'a PyObject) -> PyResult { - Ok(::try_from(obj)?.as_bytes()) + Ok(obj.downcast::()?.as_bytes()) } } #[cfg(test)] diff --git a/src/types/datetime.rs b/src/types/datetime.rs index b19a520ecc9..50d50bbaa3a 100644 --- a/src/types/datetime.rs +++ b/src/types/datetime.rs @@ -168,7 +168,7 @@ impl PyDateTime { let timestamp = timestamp.to_object(py); let time_zone_info = match time_zone_info { - Some(time_zone_info) => time_zone_info.to_object(py), + Some(time_zone_info) => time_zone_info.as_ref(), None => py.None(), }; diff --git a/src/types/dict.rs b/src/types/dict.rs index f88f763e320..24648fc9871 100644 --- a/src/types/dict.rs +++ b/src/types/dict.rs @@ -4,11 +4,11 @@ use crate::err::{self, PyErr, PyResult}; use crate::instance::PyNativeType; use crate::types::{PyList, PyObject}; use crate::AsPyPointer; +use crate::FromPyObject; #[cfg(not(PyPy))] use crate::IntoPyPointer; use crate::Python; use crate::{ffi, IntoPy, Py}; -use crate::{FromPyObject, PyTryFrom}; use crate::{ToBorrowedObject, ToPyObject}; use std::collections::{BTreeMap, HashMap}; use std::{cmp, collections, hash}; @@ -324,7 +324,7 @@ where S: hash::BuildHasher + Default, { fn extract(ob: &'source PyObject) -> Result { - let dict = ::try_from(ob)?; + let dict: &PyDict = ob.downcast()?; let mut ret = HashMap::default(); for (k, v) in dict.iter() { ret.insert(K::extract(k)?, V::extract(v)?); @@ -339,7 +339,7 @@ where V: FromPyObject<'source>, { fn extract(ob: &'source PyObject) -> Result { - let dict = ::try_from(ob)?; + let dict: &PyDict = ob.downcast()?; let mut ret = BTreeMap::new(); for (k, v) in dict.iter() { ret.insert(K::extract(k)?, V::extract(v)?); @@ -354,7 +354,7 @@ mod test { use crate::types::{PyDict, PyList, PyTuple}; use crate::ObjectProtocol; use crate::Python; - use crate::{PyTryFrom, ToPyObject}; + use crate::ToPyObject; use std::collections::{BTreeMap, HashMap}; #[test] @@ -409,11 +409,11 @@ mod test { let py = gil.python(); let mut v = HashMap::new(); let ob = v.to_object(py); - let dict = ::try_from(ob).unwrap(); + let dict: &PyDict = ob.downcast().unwrap(); assert_eq!(0, dict.len()); v.insert(7, 32); let ob = v.to_object(py); - let dict2 = ::try_from(ob).unwrap(); + let dict2: &PyDict = ob.downcast().unwrap(); assert_eq!(1, dict2.len()); } @@ -424,7 +424,7 @@ mod test { let mut v = HashMap::new(); v.insert(7, 32); let ob = v.to_object(py); - let dict = ::try_from(ob).unwrap(); + let dict: &PyDict = ob.downcast().unwrap(); assert_eq!(true, dict.contains(7i32).unwrap()); assert_eq!(false, dict.contains(8i32).unwrap()); } @@ -436,7 +436,7 @@ mod test { let mut v = HashMap::new(); v.insert(7, 32); let ob = v.to_object(py); - let dict = ::try_from(ob).unwrap(); + let dict: &PyDict = ob.downcast().unwrap(); assert_eq!(32, dict.get_item(7i32).unwrap().extract::().unwrap()); assert_eq!(None, dict.get_item(8i32)); } @@ -448,7 +448,7 @@ mod test { let mut v = HashMap::new(); v.insert(7, 32); let ob = v.to_object(py); - let dict = ::try_from(ob).unwrap(); + let dict: &PyDict = ob.downcast().unwrap(); assert!(dict.set_item(7i32, 42i32).is_ok()); // change assert!(dict.set_item(8i32, 123i32).is_ok()); // insert assert_eq!( @@ -485,7 +485,7 @@ mod test { let mut v = HashMap::new(); v.insert(7, 32); let ob = v.to_object(py); - let dict = ::try_from(ob).unwrap(); + let dict: &PyDict = ob.downcast().unwrap(); assert!(dict.set_item(7i32, 42i32).is_ok()); // change assert!(dict.set_item(8i32, 123i32).is_ok()); // insert assert_eq!(32i32, v[&7i32]); // not updated! @@ -499,7 +499,7 @@ mod test { let mut v = HashMap::new(); v.insert(7, 32); let ob = v.to_object(py); - let dict = ::try_from(ob).unwrap(); + let dict: &PyDict = ob.downcast().unwrap(); assert!(dict.del_item(7i32).is_ok()); assert_eq!(0, dict.len()); assert_eq!(None, dict.get_item(7i32)); @@ -512,7 +512,7 @@ mod test { let mut v = HashMap::new(); v.insert(7, 32); let ob = v.to_object(py); - let dict = ::try_from(ob).unwrap(); + let dict: &PyDict = ob.downcast().unwrap(); assert!(dict.del_item(7i32).is_ok()); // change assert_eq!(32i32, *v.get(&7i32).unwrap()); // not updated! } @@ -526,7 +526,7 @@ mod test { v.insert(8, 42); v.insert(9, 123); let ob = v.to_object(py); - let dict = ::try_from(ob).unwrap(); + let dict: &PyDict = ob.downcast().unwrap(); // Can't just compare against a vector of tuples since we don't have a guaranteed ordering. let mut key_sum = 0; let mut value_sum = 0; @@ -548,7 +548,7 @@ mod test { v.insert(8, 42); v.insert(9, 123); let ob = v.to_object(py); - let dict = ::try_from(ob).unwrap(); + let dict: &PyDict = ob.downcast().unwrap(); // Can't just compare against a vector of tuples since we don't have a guaranteed ordering. let mut key_sum = 0; for el in dict.keys().iter() { @@ -566,7 +566,7 @@ mod test { v.insert(8, 42); v.insert(9, 123); let ob = v.to_object(py); - let dict = ::try_from(ob).unwrap(); + let dict: &PyDict = ob.downcast().unwrap(); // Can't just compare against a vector of tuples since we don't have a guaranteed ordering. let mut values_sum = 0; for el in dict.values().iter() { @@ -584,7 +584,7 @@ mod test { v.insert(8, 42); v.insert(9, 123); let ob = v.to_object(py); - let dict = ::try_from(ob).unwrap(); + let dict: &PyDict = ob.downcast().unwrap(); let mut key_sum = 0; let mut value_sum = 0; for (key, value) in dict.iter() { @@ -604,7 +604,7 @@ mod test { v.insert(8, 42); v.insert(9, 123); let ob = v.to_object(py); - let dict = ::try_from(ob).unwrap(); + let dict: &PyDict = ob.downcast().unwrap(); let mut key_sum = 0; let mut value_sum = 0; for (key, value) in dict { @@ -624,7 +624,7 @@ mod test { map.insert(1, 1); let m = map.to_object(py); - let py_map = ::try_from(m).unwrap(); + let py_map: &PyDict = m.downcast().unwrap(); assert!(py_map.len() == 1); assert!(py_map.get_item(1).unwrap().extract::().unwrap() == 1); @@ -640,7 +640,7 @@ mod test { map.insert(1, 1); let m = map.to_object(py); - let py_map = ::try_from(m).unwrap(); + let py_map: &PyDict = m.downcast().unwrap(); assert!(py_map.len() == 1); assert!(py_map.get_item(1).unwrap().extract::().unwrap() == 1); @@ -656,7 +656,7 @@ mod test { map.insert(1, 1); let m = map.to_object(py); - let py_map = ::try_from(m).unwrap(); + let py_map: &PyDict = m.downcast().unwrap(); assert!(py_map.len() == 1); assert!(py_map.get_item(1).unwrap().extract::().unwrap() == 1); @@ -685,7 +685,7 @@ mod test { map.insert(1, 1); let m = map.to_object(py); - let py_map = ::try_from(m).unwrap(); + let py_map: &PyDict = m.downcast().unwrap(); assert!(py_map.len() == 1); assert!(py_map.get_item(1).unwrap().extract::().unwrap() == 1); diff --git a/src/types/list.rs b/src/types/list.rs index 8950fb6d9d1..2866fcfcfff 100644 --- a/src/types/list.rs +++ b/src/types/list.rs @@ -220,7 +220,7 @@ mod test { use crate::objectprotocol::ObjectProtocol; use crate::types::PyList; use crate::Python; - use crate::{PyTryFrom, ToPyObject}; + use crate::ToPyObject; #[test] fn test_new() { @@ -240,7 +240,7 @@ mod test { let py = gil.python(); let v = vec![1, 2, 3, 4]; let ob = v.to_object(py); - let list = ::try_from(ob).unwrap(); + let list: &PyList = ob.downcast().unwrap(); assert_eq!(4, list.len()); } @@ -250,7 +250,7 @@ mod test { let py = gil.python(); let v = vec![2, 3, 5, 7]; let ob = v.to_object(py); - let list = ::try_from(ob).unwrap(); + let list: &PyList = ob.downcast().unwrap(); assert_eq!(2, list.get_item(0).extract::().unwrap()); assert_eq!(3, list.get_item(1).extract::().unwrap()); assert_eq!(5, list.get_item(2).extract::().unwrap()); @@ -263,7 +263,7 @@ mod test { let py = gil.python(); let v = vec![2, 3, 5, 7]; let ob = v.to_object(py); - let list = ::try_from(ob).unwrap(); + let list: &PyList = ob.downcast().unwrap(); assert_eq!( 2, list.get_parked_item(0).as_ref(py).extract::().unwrap() @@ -288,7 +288,7 @@ mod test { let py = gil.python(); let v = vec![2, 3, 5, 7]; let ob = v.to_object(py); - let list = ::try_from(ob).unwrap(); + let list: &PyList = ob.downcast().unwrap(); let val = 42i32.to_object(py); assert_eq!(2, list.get_item(0).extract::().unwrap()); list.set_item(0, val).unwrap(); @@ -305,7 +305,7 @@ mod test { let _pool = unsafe { crate::GILPool::new() }; let v = vec![2]; let ob = v.to_object(py); - let list = ::try_from(ob).unwrap(); + let list: &PyList = ob.downcast().unwrap(); let none = py.None(); cnt = none.get_refcnt(); list.set_item(0, none).unwrap(); @@ -320,7 +320,7 @@ mod test { let py = gil.python(); let v = vec![2, 3, 5, 7]; let ob = v.to_object(py); - let list = ::try_from(ob).unwrap(); + let list: &PyList = ob.downcast().unwrap(); let val = 42i32.to_object(py); assert_eq!(4, list.len()); assert_eq!(2, list.get_item(0).extract::().unwrap()); @@ -353,7 +353,7 @@ mod test { let py = gil.python(); let v = vec![2]; let ob = v.to_object(py); - let list = ::try_from(ob).unwrap(); + let list: &PyList = ob.downcast().unwrap(); list.append(3).unwrap(); assert_eq!(2, list.get_item(0).extract::().unwrap()); assert_eq!(3, list.get_item(1).extract::().unwrap()); @@ -381,7 +381,7 @@ mod test { let py = gil.python(); let v = vec![2, 3, 5, 7]; let ob = v.to_object(py); - let list = ::try_from(ob).unwrap(); + let list: &PyList = ob.downcast().unwrap(); let mut idx = 0; for el in list.iter() { assert_eq!(v[idx], el.extract::().unwrap()); @@ -396,7 +396,7 @@ mod test { let py = gil.python(); let v = vec![1, 2, 3, 4]; let ob = v.to_object(py); - let list = ::try_from(ob).unwrap(); + let list: &PyList = ob.downcast().unwrap(); for (i, item) in list.iter().enumerate() { assert_eq!((i + 1) as i32, item.extract::().unwrap()); } @@ -408,7 +408,7 @@ mod test { let py = gil.python(); let v = vec![2, 3, 5, 7]; let ob = v.to_object(py); - let list = ::try_from(ob).unwrap(); + let list: &PyList = ob.downcast().unwrap(); let v2 = list.as_ref().extract::>().unwrap(); assert_eq!(v, v2); } @@ -452,7 +452,7 @@ mod test { let gil = Python::acquire_gil(); let py = gil.python(); let array = [1, 2].to_object(py); - let list = ::try_from(array).unwrap(); + let list: &PyList = array.downcast().unwrap(); assert_eq!(1, list.get_item(0).extract::().unwrap()); assert_eq!(2, list.get_item(1).extract::().unwrap()); } diff --git a/src/types/mod.rs b/src/types/mod.rs index 5c2101b5e24..996a4429a13 100644 --- a/src/types/mod.rs +++ b/src/types/mod.rs @@ -112,7 +112,7 @@ macro_rules! pyobject_native_type_extract { ($name: ty $(,$type_param: ident)*) => { impl<'py, $($type_param,)*> $crate::FromPyObject<'py> for &'py $name { fn extract(obj: &'py $crate::PyObject) -> $crate::PyResult { - $crate::PyTryFrom::try_from(obj).map_err(Into::into) + obj.downcast().map_err(Into::into) } } } diff --git a/src/types/sequence.rs b/src/types/sequence.rs index e988e2bf247..10daae3733b 100644 --- a/src/types/sequence.rs +++ b/src/types/sequence.rs @@ -334,7 +334,7 @@ fn extract_sequence<'s, T>(obj: &'s PyObject) -> PyResult> where T: FromPyObject<'s>, { - let seq = ::try_from(obj)?; + let seq: &PySequence = obj.downcast()?; let mut v = Vec::with_capacity(seq.len().unwrap_or(0) as usize); for item in seq.iter()? { v.push(item?.extract::()?); @@ -346,7 +346,7 @@ fn extract_sequence_into_slice<'s, T>(obj: &'s PyObject, slice: &mut [T]) -> PyR where T: FromPyObject<'s>, { - let seq = ::try_from(obj)?; + let seq: &PySequence = obj.downcast()?; if seq.len()? as usize != slice.len() { return Err(exceptions::BufferError::py_err( "Slice length does not match buffer length.", @@ -404,7 +404,7 @@ mod test { let gil = Python::acquire_gil(); let py = gil.python(); let v = 42i32; - assert!(::try_from(v.to_object(py)).is_err()); + assert!(v.to_object(py).downcast::().is_err()); } #[test] @@ -412,7 +412,7 @@ mod test { let gil = Python::acquire_gil(); let py = gil.python(); let v = "London Calling"; - assert!(::try_from(v.to_object(py)).is_ok()); + assert!(v.to_object(py).downcast::().is_ok()); } #[test] fn test_seq_empty() { @@ -420,7 +420,7 @@ mod test { let py = gil.python(); let v: Vec = vec![]; let ob = v.to_object(py); - let seq = ob.cast_as::().unwrap(); + let seq: &PySequence = ob.downcast().unwrap(); assert_eq!(0, seq.len().unwrap()); let needle = 7i32.to_object(py); @@ -433,7 +433,7 @@ mod test { let py = gil.python(); let v: Vec = vec![1, 1, 2, 3, 5, 8]; let ob = v.to_object(py); - let seq = ob.cast_as::().unwrap(); + let seq: &PySequence = ob.downcast().unwrap(); assert_eq!(6, seq.len().unwrap()); let bad_needle = 7i32.to_object(py); @@ -452,7 +452,7 @@ mod test { let py = gil.python(); let v: Vec = vec![1, 1, 2, 3, 5, 8]; let ob = v.to_object(py); - let seq = ob.cast_as::().unwrap(); + let seq: &PySequence = ob.downcast().unwrap(); assert_eq!(1, seq.get_item(0).unwrap().extract::().unwrap()); assert_eq!(1, seq.get_item(1).unwrap().extract::().unwrap()); assert_eq!(2, seq.get_item(2).unwrap().extract::().unwrap()); @@ -477,7 +477,7 @@ mod test { let py = gil.python(); let v: Vec = vec![1, 1, 2, 3, 5, 8]; let ob = v.to_object(py); - let seq = ob.cast_as::().unwrap(); + let seq: &PySequence = ob.downcast().unwrap(); assert!(seq.del_item(10).is_err()); assert_eq!(1, seq.get_item(0).unwrap().extract::().unwrap()); assert!(seq.del_item(0).is_ok()); @@ -501,7 +501,7 @@ mod test { let py = gil.python(); let v: Vec = vec![1, 2]; let ob = v.to_object(py); - let seq = ob.cast_as::().unwrap(); + let seq: &PySequence = ob.downcast().unwrap(); assert_eq!(2, seq.get_item(1).unwrap().extract::().unwrap()); assert!(seq.set_item(1, 10).is_ok()); assert_eq!(10, seq.get_item(1).unwrap().extract::().unwrap()); @@ -515,7 +515,7 @@ mod test { let py = gil.python(); let v: Vec = vec![1, 2]; let ob = v.to_object(py); - let seq = ob.cast_as::().unwrap(); + let seq: &PySequence = ob.downcast().unwrap(); assert!(seq.set_item(1, &obj).is_ok()); assert!(seq.get_item(1).unwrap().as_ptr() == obj.as_ptr()); } @@ -532,7 +532,7 @@ mod test { let py = gil.python(); let v: Vec = vec![1, 1, 2, 3, 5, 8]; let ob = v.to_object(py); - let seq = ob.cast_as::().unwrap(); + let seq: &PySequence = ob.downcast().unwrap(); assert_eq!(0, seq.index(1i32).unwrap()); assert_eq!(2, seq.index(2i32).unwrap()); assert_eq!(3, seq.index(3i32).unwrap()); @@ -547,7 +547,7 @@ mod test { let py = gil.python(); let v: Vec = vec![1, 1, 2, 3, 5, 8]; let ob = v.to_object(py); - let seq = ob.cast_as::().unwrap(); + let seq: &PySequence = ob.downcast().unwrap(); assert_eq!(2, seq.count(1i32).unwrap()); assert_eq!(1, seq.count(2i32).unwrap()); assert_eq!(1, seq.count(3i32).unwrap()); @@ -562,7 +562,7 @@ mod test { let py = gil.python(); let v: Vec = vec![1, 1, 2, 3, 5, 8]; let ob = v.to_object(py); - let seq = ob.cast_as::().unwrap(); + let seq: &PySequence = ob.downcast().unwrap(); let mut idx = 0; for el in seq.iter().unwrap() { assert_eq!(v[idx], el.unwrap().extract::().unwrap()); @@ -577,7 +577,7 @@ mod test { let py = gil.python(); let v = vec!["It", "was", "the", "worst", "of", "times"]; let ob = v.to_object(py); - let seq = ob.cast_as::().unwrap(); + let seq: &PySequence = ob.downcast().unwrap(); let bad_needle = "blurst".to_object(py); assert_eq!(false, seq.contains(bad_needle).unwrap()); @@ -592,7 +592,7 @@ mod test { let py = gil.python(); let v: Vec = vec![1, 2, 3]; let ob = v.to_object(py); - let seq = ob.cast_as::().unwrap(); + let seq: &PySequence = ob.downcast().unwrap(); let concat_seq = seq.concat(&seq).unwrap(); assert_eq!(6, concat_seq.len().unwrap()); let concat_v: Vec = vec![1, 2, 3, 1, 2, 3]; @@ -607,7 +607,7 @@ mod test { let py = gil.python(); let v = "string"; let ob = v.to_object(py); - let seq = ob.cast_as::().unwrap(); + let seq: &PySequence = ob.downcast().unwrap(); let concat_seq = seq.concat(&seq).unwrap(); assert_eq!(12, concat_seq.len().unwrap()); /*let concat_v = "stringstring".to_owned(); @@ -622,7 +622,7 @@ mod test { let py = gil.python(); let v = vec!["foo", "bar"]; let ob = v.to_object(py); - let seq = ob.cast_as::().unwrap(); + let seq: &PySequence = ob.downcast().unwrap(); let repeat_seq = seq.repeat(3).unwrap(); assert_eq!(6, repeat_seq.len().unwrap()); let repeated = vec!["foo", "bar", "foo", "bar", "foo", "bar"]; @@ -637,7 +637,7 @@ mod test { let py = gil.python(); let v = vec!["foo", "bar"]; let ob = v.to_object(py); - let seq = ob.cast_as::().unwrap(); + let seq: &PySequence = ob.downcast().unwrap(); assert!(seq.list().is_ok()); } @@ -647,7 +647,7 @@ mod test { let py = gil.python(); let v = "foo"; let ob = v.to_object(py); - let seq = ::try_from(ob).unwrap(); + let seq: &PySequence = ob.downcast().unwrap(); assert!(seq.list().is_ok()); } @@ -657,7 +657,7 @@ mod test { let py = gil.python(); let v = ("foo", "bar"); let ob = v.to_object(py); - let seq = ob.cast_as::().unwrap(); + let seq: &PySequence = ob.downcast().unwrap(); assert!(seq.tuple().is_ok()); } @@ -667,7 +667,7 @@ mod test { let py = gil.python(); let v = vec!["foo", "bar"]; let ob = v.to_object(py); - let seq = ob.cast_as::().unwrap(); + let seq: &PySequence = ob.downcast().unwrap(); assert!(seq.tuple().is_ok()); } @@ -721,7 +721,7 @@ mod test { let py = gil.python(); let v = vec!["foo", "bar"]; let ob = v.to_object(py); - let seq = ob.cast_as::().unwrap(); + let seq: &PySequence = ob.downcast().unwrap(); let type_ptr = seq.as_ref(); let seq_from = unsafe { ::try_from_unchecked(type_ptr) }; assert!(seq_from.list().is_ok()); diff --git a/src/types/set.rs b/src/types/set.rs index 56fd111e8b2..f207e1f559b 100644 --- a/src/types/set.rs +++ b/src/types/set.rs @@ -303,7 +303,7 @@ impl<'a> std::iter::IntoIterator for &'a PyFrozenSet { #[cfg(test)] mod test { use super::{PyFrozenSet, PySet}; - use crate::{AsPyRef, IntoPy, ObjectProtocol, Py, PyObject, PyTryFrom, Python, ToPyObject}; + use crate::{AsPyRef, IntoPy, ObjectProtocol, Py, PyObject, Python, ToPyObject}; use std::collections::{BTreeSet, HashSet}; use std::iter::FromIterator; @@ -334,11 +334,11 @@ mod test { let mut v = HashSet::new(); let ob = v.to_object(py); - let set = ::try_from(ob).unwrap(); + let set: &PySet = ob.downcast().unwrap(); assert_eq!(0, set.len()); v.insert(7); let ob = v.to_object(py); - let set2 = ::try_from(ob).unwrap(); + let set2: &PySet = ob.downcast().unwrap(); assert_eq!(1, set2.len()); } diff --git a/src/types/string.rs b/src/types/string.rs index 83ceeef4f89..5aaf4f8e2d9 100644 --- a/src/types/string.rs +++ b/src/types/string.rs @@ -2,7 +2,7 @@ use crate::{ ffi, gil, AsPyPointer, FromPy, FromPyObject, IntoPy, Py, PyErr, PyNativeType, PyObject, - PyResult, PyTryFrom, Python, ToPyObject, + PyResult, Python, ToPyObject, }; use std::borrow::Cow; use std::ffi::CStr; @@ -149,7 +149,7 @@ impl<'a> IntoPy> for &'a String { /// Accepts Python `str` and `unicode` objects. impl<'source> crate::FromPyObject<'source> for Cow<'source, str> { fn extract(ob: &'source PyObject) -> PyResult { - ::try_from(ob)?.to_string() + ob.downcast::()?.to_string() } } @@ -172,9 +172,7 @@ impl<'a> crate::FromPyObject<'a> for &'a str { /// Accepts Python `str` and `unicode` objects. impl<'source> FromPyObject<'source> for String { fn extract(obj: &'source PyObject) -> PyResult { - ::try_from(obj)? - .to_string() - .map(Cow::into_owned) + obj.downcast::()?.to_string().map(Cow::into_owned) } } @@ -182,7 +180,7 @@ impl<'source> FromPyObject<'source> for String { mod test { use super::PyString; use crate::Python; - use crate::{FromPyObject, ObjectProtocol, PyTryFrom, ToPyObject}; + use crate::{FromPyObject, ObjectProtocol, ToPyObject}; use std::borrow::Cow; #[test] @@ -210,8 +208,7 @@ mod test { let gil = Python::acquire_gil(); let py = gil.python(); let s = "ascii 🐈"; - let obj = PyString::new(py, s); - let py_string = ::try_from(obj).unwrap(); + let py_string = PyString::new(py, s); assert_eq!(s.as_bytes(), py_string.as_bytes().unwrap()); } @@ -220,7 +217,7 @@ mod test { let gil = Python::acquire_gil(); let py = gil.python(); let obj = py.eval(r#"'\ud800'"#, None, None).unwrap(); - let py_string = ::try_from(obj).unwrap(); + let py_string: &PyString = obj.downcast().unwrap(); assert!(py_string.as_bytes().is_err()); } @@ -229,8 +226,7 @@ mod test { let gil = Python::acquire_gil(); let py = gil.python(); let s = "ascii"; - let obj = PyString::new(py, s); - let py_string = ::try_from(obj).unwrap(); + let py_string = PyString::new(py, s); assert!(py_string.to_string().is_ok()); assert_eq!(Cow::Borrowed(s), py_string.to_string().unwrap()); } @@ -240,8 +236,7 @@ mod test { let gil = Python::acquire_gil(); let py = gil.python(); let s = "哈哈🐈"; - let obj = PyString::new(py, s); - let py_string = ::try_from(obj).unwrap(); + let py_string = PyString::new(py, s); assert!(py_string.to_string().is_ok()); assert_eq!(Cow::Borrowed(s), py_string.to_string().unwrap()); } @@ -251,7 +246,7 @@ mod test { let gil = Python::acquire_gil(); let py = gil.python(); let obj = py.eval(r#"'🐈 Hello \ud800World'"#, None, None).unwrap(); - let py_string = ::try_from(obj).unwrap(); + let py_string: &PyString = obj.downcast().unwrap(); assert_eq!(py_string.to_string_lossy(), "🐈 Hello ���World"); } } diff --git a/src/types/tuple.rs b/src/types/tuple.rs index 0b92240b073..6999b702e20 100644 --- a/src/types/tuple.rs +++ b/src/types/tuple.rs @@ -3,7 +3,7 @@ use crate::ffi::{self, Py_ssize_t}; use crate::{ exceptions, AsPyPointer, FromPy, FromPyObject, IntoPy, IntoPyPointer, ObjectProtocol, Py, - PyErr, PyNativeType, PyObject, PyResult, PyTryFrom, Python, ToPyObject, + PyErr, PyNativeType, PyObject, PyResult, Python, ToPyObject, }; use std::slice; @@ -180,7 +180,7 @@ macro_rules! tuple_conversion ({$length:expr,$(($refN:ident, $n:tt, $T:ident)),+ impl<'s, $($T: FromPyObject<'s>),+> FromPyObject<'s> for ($($T,)+) { fn extract(obj: &'s PyObject) -> PyResult { - let t = ::try_from(obj)?; + let t: &PyTuple = obj.downcast()?; let slice = t.as_slice(); if t.len() == $length { Ok(( @@ -251,7 +251,7 @@ tuple_conversion!( #[cfg(test)] mod test { use crate::types::{PyObject, PyTuple}; - use crate::{ObjectProtocol, PyTryFrom, Python, ToPyObject}; + use crate::{ObjectProtocol, Python, ToPyObject}; use std::collections::HashSet; #[test] @@ -274,7 +274,7 @@ mod test { let gil = Python::acquire_gil(); let py = gil.python(); let ob = (1, 2, 3).to_object(py); - let tuple = ::try_from(ob).unwrap(); + let tuple: &PyTuple = ob.downcast().unwrap(); assert_eq!(3, tuple.len()); let ob: &PyObject = tuple.into(); assert_eq!((1, 2, 3), ob.extract().unwrap()); @@ -285,7 +285,7 @@ mod test { let gil = Python::acquire_gil(); let py = gil.python(); let ob = (1, 2, 3).to_object(py); - let tuple = ::try_from(ob).unwrap(); + let tuple: &PyTuple = ob.downcast().unwrap(); assert_eq!(3, tuple.len()); let mut iter = tuple.iter(); assert_eq!(1, iter.next().unwrap().extract().unwrap()); @@ -298,7 +298,7 @@ mod test { let gil = Python::acquire_gil(); let py = gil.python(); let ob = (1, 2, 3).to_object(py); - let tuple = ::try_from(ob).unwrap(); + let tuple: &PyTuple = ob.downcast().unwrap(); assert_eq!(3, tuple.len()); for (i, item) in tuple.iter().enumerate() { diff --git a/tests/test_gc.rs b/tests/test_gc.rs index be2f8ef6f4d..17d159809a9 100644 --- a/tests/test_gc.rs +++ b/tests/test_gc.rs @@ -3,7 +3,7 @@ use pyo3::class::PyTraverseError; use pyo3::class::PyVisit; use pyo3::prelude::*; use pyo3::type_object::PyTypeObject; -use pyo3::{py_run, AsPyPointer, PyCell, PyTryInto}; +use pyo3::{py_run, AsPyPointer, PyCell}; use std::cell::RefCell; use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::Arc; @@ -237,7 +237,7 @@ fn inheritance_with_new_methods_with_drop() { let typeobj = py.get_type::(); let inst = typeobj.call((), None).unwrap(); - let obj: &PyCell = inst.try_into().unwrap(); + let obj: &PyCell = inst.downcast().unwrap(); let mut obj_ref_mut = obj.borrow_mut(); obj_ref_mut.data = Some(Arc::clone(&drop_called1)); obj_ref_mut.as_mut().data = Some(Arc::clone(&drop_called2));