pyo3/conversions/std/
vec.rsuse crate::conversion::IntoPyObject;
#[cfg(feature = "experimental-inspect")]
use crate::inspect::types::TypeInfo;
use crate::types::list::new_from_iter;
use crate::{Bound, PyAny, PyErr, PyObject, Python};
#[allow(deprecated)]
use crate::{IntoPy, ToPyObject};
#[allow(deprecated)]
impl<T> ToPyObject for [T]
where
T: ToPyObject,
{
fn to_object(&self, py: Python<'_>) -> PyObject {
let mut iter = self.iter().map(|e| e.to_object(py));
let list = new_from_iter(py, &mut iter);
list.into()
}
}
#[allow(deprecated)]
impl<T> ToPyObject for Vec<T>
where
T: ToPyObject,
{
fn to_object(&self, py: Python<'_>) -> PyObject {
self.as_slice().to_object(py)
}
}
#[allow(deprecated)]
impl<T> IntoPy<PyObject> for Vec<T>
where
T: IntoPy<PyObject>,
{
fn into_py(self, py: Python<'_>) -> PyObject {
let mut iter = self.into_iter().map(|e| e.into_py(py));
let list = new_from_iter(py, &mut iter);
list.into()
}
}
impl<'py, T> IntoPyObject<'py> for Vec<T>
where
T: IntoPyObject<'py>,
{
type Target = PyAny;
type Output = Bound<'py, Self::Target>;
type Error = PyErr;
#[inline]
fn into_pyobject(self, py: Python<'py>) -> Result<Self::Output, Self::Error> {
T::owned_sequence_into_pyobject(self, py, crate::conversion::private::Token)
}
#[cfg(feature = "experimental-inspect")]
fn type_output() -> TypeInfo {
TypeInfo::list_of(T::type_output())
}
}
impl<'a, 'py, T> IntoPyObject<'py> for &'a Vec<T>
where
&'a T: IntoPyObject<'py>,
T: 'a, {
type Target = PyAny;
type Output = Bound<'py, Self::Target>;
type Error = PyErr;
#[inline]
fn into_pyobject(self, py: Python<'py>) -> Result<Self::Output, Self::Error> {
self.as_slice().into_pyobject(py).map(Bound::into_any)
}
#[cfg(feature = "experimental-inspect")]
fn type_output() -> TypeInfo {
TypeInfo::list_of(<&T>::type_output())
}
}
#[cfg(test)]
mod tests {
use crate::conversion::IntoPyObject;
use crate::types::{PyAnyMethods, PyBytes, PyBytesMethods, PyList};
use crate::Python;
#[test]
fn test_vec_intopyobject_impl() {
Python::with_gil(|py| {
let bytes: Vec<u8> = b"foobar".to_vec();
let obj = bytes.clone().into_pyobject(py).unwrap();
assert!(obj.is_instance_of::<PyBytes>());
let obj = obj.downcast_into::<PyBytes>().unwrap();
assert_eq!(obj.as_bytes(), &bytes);
let nums: Vec<u16> = vec![0, 1, 2, 3];
let obj = nums.into_pyobject(py).unwrap();
assert!(obj.is_instance_of::<PyList>());
});
}
#[test]
fn test_vec_reference_intopyobject_impl() {
Python::with_gil(|py| {
let bytes: Vec<u8> = b"foobar".to_vec();
let obj = (&bytes).into_pyobject(py).unwrap();
assert!(obj.is_instance_of::<PyBytes>());
let obj = obj.downcast_into::<PyBytes>().unwrap();
assert_eq!(obj.as_bytes(), &bytes);
let nums: Vec<u16> = vec![0, 1, 2, 3];
let obj = (&nums).into_pyobject(py).unwrap();
assert!(obj.is_instance_of::<PyList>());
});
}
}