|
18 | 18 |
|
19 | 19 | use std::mem;
|
20 | 20 | use ffi;
|
21 |
| -use python::{Python, PythonObject, ToPythonPointer, PyClone}; |
22 |
| -use conversion::ToPyObject; |
| 21 | +use python::{Python, PythonObject, ToPythonPointer, PyClone, PyDrop}; |
| 22 | +use conversion::{FromPyObject, ToPyObject}; |
23 | 23 | use objects::{PyObject, PyList, PyTuple, PyIterator};
|
24 | 24 | use ffi::Py_ssize_t;
|
25 | 25 | use err;
|
@@ -208,6 +208,21 @@ impl PySequence {
|
208 | 208 | }
|
209 | 209 | }
|
210 | 210 |
|
| 211 | +impl <'source, T> FromPyObject<'source> for Vec<T> |
| 212 | + where for<'a> T: FromPyObject<'a> |
| 213 | +{ |
| 214 | + fn extract(py: Python, obj: &'source PyObject) -> PyResult<Self> { |
| 215 | + let seq = try!(obj.cast_as::<PySequence>(py)); |
| 216 | + let mut v = Vec::new(); |
| 217 | + for item in try!(seq.iter(py)) { |
| 218 | + let item = try!(item); |
| 219 | + v.push(try!(T::extract(py, &item))); |
| 220 | + item.release_ref(py); |
| 221 | + } |
| 222 | + Ok(v) |
| 223 | + } |
| 224 | +} |
| 225 | + |
211 | 226 | #[cfg(test)]
|
212 | 227 | mod test {
|
213 | 228 | use std;
|
@@ -386,8 +401,8 @@ mod test {
|
386 | 401 | let concat_seq = seq.concat(py, &seq).unwrap().cast_into::<PySequence>(py).unwrap();
|
387 | 402 | assert_eq!(12, concat_seq.len(py).unwrap());
|
388 | 403 | /*let concat_v = "stringstring".to_owned();
|
389 |
| - for (el, cc) in seq.into_iter(py).zip(concat_v.chars()) { |
390 |
| - assert_eq!(cc, el.extract::<char>(py).unwrap()); TODO: extract::<char>() is not implemented |
| 404 | + for (el, cc) in seq.iter(py).unwrap().zip(concat_v.chars()) { |
| 405 | + assert_eq!(cc, el.unwrap().extract::<char>(py).unwrap()); //TODO: extract::<char>() is not implemented |
391 | 406 | }*/
|
392 | 407 | }
|
393 | 408 |
|
@@ -440,4 +455,20 @@ mod test {
|
440 | 455 | let seq = v.to_py_object(py).into_object().cast_into::<PySequence>(py).unwrap();
|
441 | 456 | assert!(seq.tuple(py).is_ok());
|
442 | 457 | }
|
| 458 | + |
| 459 | + #[test] |
| 460 | + fn test_extract_tuple_to_vec() { |
| 461 | + let gil = Python::acquire_gil(); |
| 462 | + let py = gil.python(); |
| 463 | + let v: Vec<i32> = py.eval("(1, 2)", None, None).unwrap().extract(py).unwrap(); |
| 464 | + assert!(v == [1, 2]); |
| 465 | + } |
| 466 | + |
| 467 | + #[test] |
| 468 | + fn test_extract_range_to_vec() { |
| 469 | + let gil = Python::acquire_gil(); |
| 470 | + let py = gil.python(); |
| 471 | + let v: Vec<i32> = py.eval("range(1, 5)", None, None).unwrap().extract(py).unwrap(); |
| 472 | + assert!(v == [1, 2, 3, 4]); |
| 473 | + } |
443 | 474 | }
|
0 commit comments