Skip to content

Commit 8e90d48

Browse files
committed
Tidy up examples and PR code
1 parent fca8ef8 commit 8e90d48

21 files changed

+104
-116
lines changed

examples/rustapi_module/src/datetime.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ fn make_time<'p>(
3838
minute,
3939
second,
4040
microsecond,
41-
tzinfo.map(|o| o.to_object(py)),
41+
tzinfo.map(|o| o.as_ref()),
4242
)
4343
}
4444

@@ -59,7 +59,7 @@ fn time_with_fold<'p>(
5959
minute,
6060
second,
6161
microsecond,
62-
tzinfo.map(|o| o.to_object(py)),
62+
tzinfo.map(|o| o.as_ref()),
6363
fold,
6464
)
6565
}
@@ -135,7 +135,7 @@ fn make_datetime<'p>(
135135
minute,
136136
second,
137137
microsecond,
138-
tzinfo.map(|o| (o.to_object(py))),
138+
tzinfo.map(|o| o.as_ref()),
139139
)
140140
}
141141

examples/rustapi_module/src/objstore.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ impl ObjStore {
1313
ObjStore::default()
1414
}
1515

16-
fn push(&mut self, py: Python, obj: &PyObject) {
17-
self.obj.push(obj.to_object(py).into());
16+
fn push(&mut self, obj: &PyObject) {
17+
self.obj.push(obj.into());
1818
}
1919
}
2020

guide/src/conversions.md

+5-6
Original file line numberDiff line numberDiff line change
@@ -131,13 +131,12 @@ Just like `From<T>`, if you implement `FromPy<T>` you gain a blanket implementat
131131
Eventually, traits such as [`ToPyObject`] will be replaced by this trait and a [`FromPy`] trait will be added that will implement
132132
[`IntoPy`], just like with `From` and `Into`.
133133

134-
[`IntoPy`]: https://docs.rs/pyo3/latest/pyo3/trait.IntoPy.html
135-
[`FromPy`]: https://docs.rs/pyo3/latest/pyo3/trait.FromPy.html
136-
[`FromPyObject`]: https://docs.rs/pyo3/latest/pyo3/types/trait.FromPyObject.html
137-
[`ToPyObject`]: https://docs.rs/pyo3/latest/pyo3/trait.ToPyObject.html
138-
[`PyObject`]: https://docs.rs/pyo3/latest/pyo3/struct.PyObject.html
134+
[`IntoPy`]: https://docs.rs/pyo3/latest/pyo3/conversion/trait.IntoPy.html
135+
[`FromPy`]: https://docs.rs/pyo3/latest/pyo3/conversion.FromPy.html
136+
[`FromPyObject`]: https://docs.rs/pyo3/latest/pyo3/conversion/trait.FromPyObject.html
137+
[`ToPyObject`]: https://docs.rs/pyo3/latest/pyo3/conversion/trait.ToPyObject.html
138+
[`PyObject`]: https://docs.rs/pyo3/latest/pyo3/types/struct.PyObject.html
139139
[`PyTuple`]: https://docs.rs/pyo3/latest/pyo3/types/struct.PyTuple.html
140-
[`PyObject`]: https://docs.rs/pyo3/latest/pyo3/struct.PyObject.html
141140
[`IntoPyDict`]: https://docs.rs/pyo3/latest/pyo3/types/trait.IntoPyDict.html
142141

143142
[`PyRef`]: https://pyo3.rs/master/doc/pyo3/pycell/struct.PyRef.html

src/class/basic.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
1111
use crate::callback::HashCallbackOutput;
1212
use crate::{
13-
exceptions, ffi, FromPyObject, IntoPy, PyObject, PyCell, PyClass, PyErr, PyResult, Py,
13+
exceptions, ffi, FromPyObject, IntoPy, Py, PyCell, PyClass, PyErr, PyObject, PyResult,
1414
};
1515
use std::os::raw::c_int;
1616

src/derive_utils.rs

+1-4
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
77
use crate::err::{PyErr, PyResult};
88
use crate::exceptions::TypeError;
9-
use crate::instance::PyNativeType;
109
use crate::pyclass::PyClass;
1110
use crate::pyclass_init::PyClassInitializer;
1211
use crate::types::{PyDict, PyModule, PyObject, PyTuple};
@@ -98,9 +97,7 @@ pub fn parse_fn_args<'p>(
9897
}
9998
// Adjust the remaining args
10099
let args = if accept_args {
101-
let py = args.py();
102-
let slice = args.slice(used_args as isize, nargs as isize);
103-
py.checked_cast_as(slice.as_ref().into()).unwrap()
100+
args.slice(used_args as isize, nargs as isize)
104101
} else {
105102
args
106103
};

src/ffi/setobject.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -41,14 +41,14 @@ pub unsafe fn PyFrozenSet_CheckExact(ob: *mut PyObject) -> c_int {
4141
}
4242

4343
#[inline]
44-
#[cfg_attr(PyPy, link_name = "PyPyObjectSet_CheckExact")]
45-
pub unsafe fn PyObjectSet_CheckExact(ob: *mut PyObject) -> c_int {
44+
#[cfg_attr(PyPy, link_name = "PyPyAnySet_CheckExact")]
45+
pub unsafe fn PyAnySet_CheckExact(ob: *mut PyObject) -> c_int {
4646
(Py_TYPE(ob) == &mut PySet_Type || Py_TYPE(ob) == &mut PyFrozenSet_Type) as c_int
4747
}
4848

4949
#[inline]
50-
pub unsafe fn PyObjectSet_Check(ob: *mut PyObject) -> c_int {
51-
(PyObjectSet_CheckExact(ob) != 0
50+
pub unsafe fn PyAnySet_Check(ob: *mut PyObject) -> c_int {
51+
(PyAnySet_CheckExact(ob) != 0
5252
|| PyType_IsSubtype(Py_TYPE(ob), &mut PySet_Type) != 0
5353
|| PyType_IsSubtype(Py_TYPE(ob), &mut PyFrozenSet_Type) != 0) as c_int
5454
}

src/gil.rs

+4-2
Original file line numberDiff line numberDiff line change
@@ -359,7 +359,7 @@ fn decrement_gil_count() {
359359
#[cfg(test)]
360360
mod test {
361361
use super::{gil_is_acquired, GILPool, GIL_COUNT, OWNED_OBJECTS, POOL};
362-
use crate::{ffi, gil, AsPyPointer, IntoPyPointer, Python, IntoPy, Py, PyObject};
362+
use crate::{ffi, gil, AsPyPointer, IntoPy, IntoPyPointer, Py, PyObject, Python};
363363
use std::ptr::NonNull;
364364

365365
fn get_object(py: Python) -> Py<PyObject> {
@@ -640,7 +640,9 @@ mod test {
640640
let _pool = GILPool::new();
641641

642642
// Rebuild obj so that it can be dropped
643-
Py::<PyObject>::from_owned_ptr(ffi::PyCapsule_GetPointer(capsule, std::ptr::null()) as _);
643+
Py::<PyObject>::from_owned_ptr(
644+
ffi::PyCapsule_GetPointer(capsule, std::ptr::null()) as _,
645+
);
644646
}
645647

646648
let ptr = obj.into_ptr();

src/instance.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -286,7 +286,7 @@ impl<T> Py<T> {
286286
// }
287287
}
288288

289-
/// Retrieves `&'py` types from `Py<T>` or `Py<PyObject>`.
289+
/// Retrieves `&'py` types from `Py<T>`.
290290
///
291291
/// # Examples
292292
/// `Py<T>::as_ref` returns `&PyDict`, `&PyList` or so for native types, and `&PyCell<T>`

src/prelude.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,6 @@ pub use crate::pyclass_init::PyClassInitializer;
1818
pub use crate::python::Python;
1919
pub use crate::{FromPy, FromPyObject, IntoPy, IntoPyPointer, PyTryFrom, PyTryInto, ToPyObject};
2020
// PyModule is only part of the prelude because we need it for the pymodule function
21-
pub use crate::types::{PyObject, PyModule};
21+
pub use crate::types::{PyModule, PyObject};
2222
#[cfg(feature = "macros")]
2323
pub use pyo3cls::{pyclass, pyfunction, pymethods, pymodule, pyproto};

src/python.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -352,7 +352,7 @@ impl<'p> Python<'p> {
352352
/// Registers the object in the release pool, and tries to downcast to specific type.
353353
pub fn checked_cast_as<T>(self, obj: Py<PyObject>) -> Result<&'p T, PyDowncastError>
354354
where
355-
T: PyTryFrom<'p>,
355+
T: for<'py> PyTryFrom<'py>,
356356
{
357357
let any: &PyObject = unsafe { self.from_owned_ptr(obj.into_ptr()) };
358358
<T as PyTryFrom>::try_from(any)

src/types/boolobject.rs

+2-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
// Copyright (c) 2017-present PyO3 Project and Contributors
22
use crate::{
3-
ffi, AsPyPointer, FromPy, FromPyObject, IntoPy, Py, PyObject, PyResult, PyTryFrom, Python,
4-
ToPyObject,
3+
ffi, AsPyPointer, FromPy, FromPyObject, IntoPy, Py, PyObject, PyResult, Python, ToPyObject,
54
};
65

76
/// Represents a Python `bool`.
@@ -50,7 +49,7 @@ impl FromPy<bool> for Py<PyObject> {
5049
/// Fails with `TypeError` if the input is not a Python `bool`.
5150
impl<'source> FromPyObject<'source> for bool {
5251
fn extract(obj: &'source PyObject) -> PyResult<Self> {
53-
Ok(<PyBool as PyTryFrom>::try_from(obj)?.is_true())
52+
Ok(obj.downcast::<PyBool>()?.is_true())
5453
}
5554
}
5655

src/types/bytes.rs

+2-4
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
use crate::{
2-
ffi, AsPyPointer, FromPy, FromPyObject, IntoPy, Py, PyObject, PyResult, PyTryFrom, Python,
3-
};
1+
use crate::{ffi, AsPyPointer, FromPy, FromPyObject, IntoPy, Py, PyObject, PyResult, Python};
42
use std::ops::Index;
53
use std::os::raw::c_char;
64
use std::slice::SliceIndex;
@@ -64,7 +62,7 @@ impl<'a> FromPy<&'a [u8]> for Py<PyObject> {
6462

6563
impl<'a> FromPyObject<'a> for &'a [u8] {
6664
fn extract(obj: &'a PyObject) -> PyResult<Self> {
67-
Ok(<PyBytes as PyTryFrom>::try_from(obj)?.as_bytes())
65+
Ok(obj.downcast::<PyBytes>()?.as_bytes())
6866
}
6967
}
7068
#[cfg(test)]

src/types/datetime.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ impl PyDateTime {
168168
let timestamp = timestamp.to_object(py);
169169

170170
let time_zone_info = match time_zone_info {
171-
Some(time_zone_info) => time_zone_info.to_object(py),
171+
Some(time_zone_info) => time_zone_info.as_ref(),
172172
None => py.None(),
173173
};
174174

src/types/dict.rs

+21-23
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,7 @@ use crate::instance::PyNativeType;
55
use crate::types::{PyList, PyObject};
66
#[cfg(not(PyPy))]
77
use crate::IntoPyPointer;
8-
use crate::{
9-
ffi, AsPyPointer, FromPyObject, IntoPy, Py, PyTryFrom, Python, ToBorrowedObject, ToPyObject,
10-
};
8+
use crate::{ffi, AsPyPointer, FromPyObject, IntoPy, Py, Python, ToBorrowedObject, ToPyObject};
119
use std::collections::{BTreeMap, HashMap};
1210
use std::ptr::NonNull;
1311
use std::{cmp, collections, hash};
@@ -330,7 +328,7 @@ where
330328
S: hash::BuildHasher + Default,
331329
{
332330
fn extract(ob: &'source PyObject) -> Result<Self, PyErr> {
333-
let dict = <PyDict as PyTryFrom>::try_from(ob)?;
331+
let dict: &PyDict = ob.downcast()?;
334332
let mut ret = HashMap::default();
335333
for (k, v) in dict.iter() {
336334
ret.insert(K::extract(k)?, V::extract(v)?);
@@ -345,7 +343,7 @@ where
345343
V: FromPyObject<'source>,
346344
{
347345
fn extract(ob: &'source PyObject) -> Result<Self, PyErr> {
348-
let dict = <PyDict as PyTryFrom>::try_from(ob)?;
346+
let dict: &PyDict = ob.downcast()?;
349347
let mut ret = BTreeMap::new();
350348
for (k, v) in dict.iter() {
351349
ret.insert(K::extract(k)?, V::extract(v)?);
@@ -359,7 +357,7 @@ mod test {
359357
use crate::types::dict::IntoPyDict;
360358
use crate::types::{PyDict, PyList, PyTuple};
361359
use crate::Python;
362-
use crate::{PyTryFrom, ToPyObject};
360+
use crate::ToPyObject;
363361
use std::collections::{BTreeMap, HashMap};
364362

365363
#[test]
@@ -414,11 +412,11 @@ mod test {
414412
let py = gil.python();
415413
let mut v = HashMap::new();
416414
let ob = v.to_object(py);
417-
let dict = <PyDict as PyTryFrom>::try_from(ob).unwrap();
415+
let dict: &PyDict = ob.downcast().unwrap();
418416
assert_eq!(0, dict.len());
419417
v.insert(7, 32);
420418
let ob = v.to_object(py);
421-
let dict2 = <PyDict as PyTryFrom>::try_from(ob).unwrap();
419+
let dict2: &PyDict = ob.downcast().unwrap();
422420
assert_eq!(1, dict2.len());
423421
}
424422

@@ -429,7 +427,7 @@ mod test {
429427
let mut v = HashMap::new();
430428
v.insert(7, 32);
431429
let ob = v.to_object(py);
432-
let dict = <PyDict as PyTryFrom>::try_from(ob).unwrap();
430+
let dict: &PyDict = ob.downcast().unwrap();
433431
assert_eq!(true, dict.contains(7i32).unwrap());
434432
assert_eq!(false, dict.contains(8i32).unwrap());
435433
}
@@ -441,7 +439,7 @@ mod test {
441439
let mut v = HashMap::new();
442440
v.insert(7, 32);
443441
let ob = v.to_object(py);
444-
let dict = <PyDict as PyTryFrom>::try_from(ob).unwrap();
442+
let dict: &PyDict = ob.downcast().unwrap();
445443
assert_eq!(32, dict.get_item(7i32).unwrap().extract::<i32>().unwrap());
446444
assert_eq!(None, dict.get_item(8i32));
447445
}
@@ -453,7 +451,7 @@ mod test {
453451
let mut v = HashMap::new();
454452
v.insert(7, 32);
455453
let ob = v.to_object(py);
456-
let dict = <PyDict as PyTryFrom>::try_from(ob).unwrap();
454+
let dict: &PyDict = ob.downcast().unwrap();
457455
assert!(dict.set_item(7i32, 42i32).is_ok()); // change
458456
assert!(dict.set_item(8i32, 123i32).is_ok()); // insert
459457
assert_eq!(
@@ -490,7 +488,7 @@ mod test {
490488
let mut v = HashMap::new();
491489
v.insert(7, 32);
492490
let ob = v.to_object(py);
493-
let dict = <PyDict as PyTryFrom>::try_from(ob).unwrap();
491+
let dict: &PyDict = ob.downcast().unwrap();
494492
assert!(dict.set_item(7i32, 42i32).is_ok()); // change
495493
assert!(dict.set_item(8i32, 123i32).is_ok()); // insert
496494
assert_eq!(32i32, v[&7i32]); // not updated!
@@ -504,7 +502,7 @@ mod test {
504502
let mut v = HashMap::new();
505503
v.insert(7, 32);
506504
let ob = v.to_object(py);
507-
let dict = <PyDict as PyTryFrom>::try_from(ob).unwrap();
505+
let dict: &PyDict = ob.downcast().unwrap();
508506
assert!(dict.del_item(7i32).is_ok());
509507
assert_eq!(0, dict.len());
510508
assert_eq!(None, dict.get_item(7i32));
@@ -517,7 +515,7 @@ mod test {
517515
let mut v = HashMap::new();
518516
v.insert(7, 32);
519517
let ob = v.to_object(py);
520-
let dict = <PyDict as PyTryFrom>::try_from(ob).unwrap();
518+
let dict: &PyDict = ob.downcast().unwrap();
521519
assert!(dict.del_item(7i32).is_ok()); // change
522520
assert_eq!(32i32, *v.get(&7i32).unwrap()); // not updated!
523521
}
@@ -531,7 +529,7 @@ mod test {
531529
v.insert(8, 42);
532530
v.insert(9, 123);
533531
let ob = v.to_object(py);
534-
let dict = <PyDict as PyTryFrom>::try_from(ob).unwrap();
532+
let dict: &PyDict = ob.downcast().unwrap();
535533
// Can't just compare against a vector of tuples since we don't have a guaranteed ordering.
536534
let mut key_sum = 0;
537535
let mut value_sum = 0;
@@ -553,7 +551,7 @@ mod test {
553551
v.insert(8, 42);
554552
v.insert(9, 123);
555553
let ob = v.to_object(py);
556-
let dict = <PyDict as PyTryFrom>::try_from(ob).unwrap();
554+
let dict: &PyDict = ob.downcast().unwrap();
557555
// Can't just compare against a vector of tuples since we don't have a guaranteed ordering.
558556
let mut key_sum = 0;
559557
for el in dict.keys().iter() {
@@ -571,7 +569,7 @@ mod test {
571569
v.insert(8, 42);
572570
v.insert(9, 123);
573571
let ob = v.to_object(py);
574-
let dict = <PyDict as PyTryFrom>::try_from(ob).unwrap();
572+
let dict: &PyDict = ob.downcast().unwrap();
575573
// Can't just compare against a vector of tuples since we don't have a guaranteed ordering.
576574
let mut values_sum = 0;
577575
for el in dict.values().iter() {
@@ -589,7 +587,7 @@ mod test {
589587
v.insert(8, 42);
590588
v.insert(9, 123);
591589
let ob = v.to_object(py);
592-
let dict = <PyDict as PyTryFrom>::try_from(ob).unwrap();
590+
let dict: &PyDict = ob.downcast().unwrap();
593591
let mut key_sum = 0;
594592
let mut value_sum = 0;
595593
for (key, value) in dict.iter() {
@@ -609,7 +607,7 @@ mod test {
609607
v.insert(8, 42);
610608
v.insert(9, 123);
611609
let ob = v.to_object(py);
612-
let dict = <PyDict as PyTryFrom>::try_from(ob).unwrap();
610+
let dict: &PyDict = ob.downcast().unwrap();
613611
let mut key_sum = 0;
614612
let mut value_sum = 0;
615613
for (key, value) in dict {
@@ -629,7 +627,7 @@ mod test {
629627
map.insert(1, 1);
630628

631629
let m = map.to_object(py);
632-
let py_map = <PyDict as PyTryFrom>::try_from(m).unwrap();
630+
let py_map: &PyDict = m.downcast().unwrap();
633631

634632
assert!(py_map.len() == 1);
635633
assert!(py_map.get_item(1).unwrap().extract::<i32>().unwrap() == 1);
@@ -645,7 +643,7 @@ mod test {
645643
map.insert(1, 1);
646644

647645
let m = map.to_object(py);
648-
let py_map = <PyDict as PyTryFrom>::try_from(m).unwrap();
646+
let py_map: &PyDict = m.downcast().unwrap();
649647

650648
assert!(py_map.len() == 1);
651649
assert!(py_map.get_item(1).unwrap().extract::<i32>().unwrap() == 1);
@@ -661,7 +659,7 @@ mod test {
661659
map.insert(1, 1);
662660

663661
let m = map.to_object(py);
664-
let py_map = <PyDict as PyTryFrom>::try_from(m).unwrap();
662+
let py_map: &PyDict = m.downcast().unwrap();
665663

666664
assert!(py_map.len() == 1);
667665
assert!(py_map.get_item(1).unwrap().extract::<i32>().unwrap() == 1);
@@ -690,7 +688,7 @@ mod test {
690688
map.insert(1, 1);
691689

692690
let m = map.to_object(py);
693-
let py_map = <PyDict as PyTryFrom>::try_from(m).unwrap();
691+
let py_map: &PyDict = m.downcast().unwrap();
694692

695693
assert!(py_map.len() == 1);
696694
assert!(py_map.get_item(1).unwrap().extract::<i32>().unwrap() == 1);

0 commit comments

Comments
 (0)