@@ -80,15 +80,17 @@ pub(crate) fn init(py: Python, parent: &Bound<PyModule>) -> PyResult<()> {
8080/// A type adapter used to extract an ArrayRef from a Python object.
8181pub type PyArrayRef = PyVortex < ArrayRef > ;
8282
83- impl < ' py > FromPyObject < ' py > for PyArrayRef {
84- fn extract_bound ( ob : & Bound < ' py , PyAny > ) -> PyResult < Self > {
83+ impl < ' py > FromPyObject < ' _ , ' py > for PyArrayRef {
84+ type Error = PyErr ;
85+
86+ fn extract ( ob : Borrowed < ' _ , ' py , PyAny > ) -> Result < Self , Self :: Error > {
8587 // If it's already native, then we're done.
86- if let Ok ( native) = ob. downcast :: < PyNativeArray > ( ) {
88+ if let Ok ( native) = ob. cast :: < PyNativeArray > ( ) {
8789 return Ok ( Self ( native. get ( ) . inner ( ) . clone ( ) ) ) ;
8890 }
8991
9092 // Otherwise, if it's a subclass of `PyArray`, then we can extract the inner array.
91- PythonArray :: extract_bound ( ob) . map ( |instance| Self ( instance. to_array ( ) ) )
93+ PythonArray :: extract ( ob) . map ( |instance| Self ( instance. to_array ( ) ) )
9294 }
9395}
9496
@@ -198,7 +200,7 @@ impl PyArray {
198200 /// :class:`~vortex.Array`
199201 #[ staticmethod]
200202 fn from_arrow ( obj : Bound < ' _ , PyAny > ) -> PyResult < PyArrayRef > {
201- from_arrow:: from_arrow ( & obj)
203+ from_arrow:: from_arrow ( & obj. as_borrowed ( ) )
202204 }
203205
204206 /// Convert a Python range into a Vortex array.
@@ -241,13 +243,13 @@ impl PyArray {
241243 #[ staticmethod]
242244 #[ pyo3( signature = ( range, * , dtype = None ) ) ]
243245 fn from_range ( range : Bound < PyAny > , dtype : Option < Bound < PyDType > > ) -> PyResult < PyArrayRef > {
244- let range = range. downcast :: < PyRange > ( ) ?;
246+ let range = range. cast :: < PyRange > ( ) ?;
245247 let start = range. start ( ) ?;
246248 let stop = range. stop ( ) ?;
247249 let step = range. step ( ) ?;
248250
249251 let ( ptype, dtype) = if let Some ( dtype) = dtype {
250- let dtype = dtype. downcast :: < PyDType > ( ) ?. get ( ) . inner ( ) . clone ( ) ;
252+ let dtype = dtype. cast :: < PyDType > ( ) ?. get ( ) . inner ( ) . clone ( ) ;
251253 let DType :: Primitive ( ptype, ..) = & dtype else {
252254 return Err ( PyValueError :: new_err (
253255 "Cannot construct non-numeric array from a range." ,
@@ -297,7 +299,7 @@ impl PyArray {
297299 /// ```
298300 fn to_arrow_array < ' py > ( self_ : & ' py Bound < ' py , Self > ) -> PyResult < Bound < ' py , PyAny > > {
299301 // NOTE(ngates): for struct arrays, we could also return a RecordBatchStreamReader.
300- let array = PyArrayRef :: extract_bound ( self_. as_any ( ) ) ?. into_inner ( ) ;
302+ let array = PyArrayRef :: extract ( self_. as_any ( ) . as_borrowed ( ) ) ?. into_inner ( ) ;
301303 let py = self_. py ( ) ;
302304
303305 if let Some ( chunked_array) = array. as_opt :: < ChunkedVTable > ( ) {
@@ -347,15 +349,15 @@ impl PyArray {
347349 /// Returns the encoding ID of this array.
348350 #[ getter]
349351 fn id ( slf : & Bound < Self > ) -> PyResult < String > {
350- Ok ( PyArrayRef :: extract_bound ( slf. as_any ( ) ) ?
352+ Ok ( PyArrayRef :: extract ( slf. as_any ( ) . as_borrowed ( ) ) ?
351353 . encoding_id ( )
352354 . to_string ( ) )
353355 }
354356
355357 /// Returns the number of bytes used by this array.
356358 #[ getter]
357359 fn nbytes ( slf : & Bound < Self > ) -> PyResult < u64 > {
358- Ok ( PyArrayRef :: extract_bound ( slf. as_any ( ) ) ?. nbytes ( ) )
360+ Ok ( PyArrayRef :: extract ( slf. as_any ( ) . as_borrowed ( ) ) ?. nbytes ( ) )
359361 }
360362
361363 /// Returns the data type of this array.
@@ -392,48 +394,50 @@ impl PyArray {
392394 fn dtype < ' py > ( slf : & ' py Bound < ' py , Self > ) -> PyResult < Bound < ' py , PyDType > > {
393395 PyDType :: init (
394396 slf. py ( ) ,
395- PyArrayRef :: extract_bound ( slf. as_any ( ) ) ?. dtype ( ) . clone ( ) ,
397+ PyArrayRef :: extract ( slf. as_any ( ) . as_borrowed ( ) ) ?
398+ . dtype ( )
399+ . clone ( ) ,
396400 )
397401 }
398402
399403 ///Rust docs are *not* copied into Python for __lt__: https://github.com/PyO3/pyo3/issues/4326
400404 fn __lt__ ( slf : Bound < Self > , other : PyArrayRef ) -> PyResult < PyArrayRef > {
401- let slf = PyArrayRef :: extract_bound ( slf. as_any ( ) ) ?. into_inner ( ) ;
405+ let slf = PyArrayRef :: extract ( slf. as_any ( ) . as_borrowed ( ) ) ?. into_inner ( ) ;
402406 let inner = compare ( & slf, & * other, Operator :: Lt ) ?;
403407 Ok ( PyArrayRef :: from ( inner) )
404408 }
405409
406410 ///Rust docs are *not* copied into Python for __le__: https://github.com/PyO3/pyo3/issues/4326
407411 fn __le__ ( slf : Bound < Self > , other : PyArrayRef ) -> PyResult < PyArrayRef > {
408- let slf = PyArrayRef :: extract_bound ( slf. as_any ( ) ) ?. into_inner ( ) ;
412+ let slf = PyArrayRef :: extract ( slf. as_any ( ) . as_borrowed ( ) ) ?. into_inner ( ) ;
409413 let inner = compare ( & * slf, & * other, Operator :: Lte ) ?;
410414 Ok ( PyArrayRef :: from ( inner) )
411415 }
412416
413417 ///Rust docs are *not* copied into Python for __eq__: https://github.com/PyO3/pyo3/issues/4326
414418 fn __eq__ ( slf : Bound < Self > , other : PyArrayRef ) -> PyResult < PyArrayRef > {
415- let slf = PyArrayRef :: extract_bound ( slf. as_any ( ) ) ?. into_inner ( ) ;
419+ let slf = PyArrayRef :: extract ( slf. as_any ( ) . as_borrowed ( ) ) ?. into_inner ( ) ;
416420 let inner = compare ( & * slf, & * other, Operator :: Eq ) ?;
417421 Ok ( PyArrayRef :: from ( inner) )
418422 }
419423
420424 ///Rust docs are *not* copied into Python for __ne__: https://github.com/PyO3/pyo3/issues/4326
421425 fn __ne__ ( slf : Bound < Self > , other : PyArrayRef ) -> PyResult < PyArrayRef > {
422- let slf = PyArrayRef :: extract_bound ( slf. as_any ( ) ) ?. into_inner ( ) ;
426+ let slf = PyArrayRef :: extract ( slf. as_any ( ) . as_borrowed ( ) ) ?. into_inner ( ) ;
423427 let inner = compare ( & * slf, & * other, Operator :: NotEq ) ?;
424428 Ok ( PyArrayRef :: from ( inner) )
425429 }
426430
427431 ///Rust docs are *not* copied into Python for __ge__: https://github.com/PyO3/pyo3/issues/4326
428432 fn __ge__ ( slf : Bound < Self > , other : PyArrayRef ) -> PyResult < PyArrayRef > {
429- let slf = PyArrayRef :: extract_bound ( slf. as_any ( ) ) ?. into_inner ( ) ;
433+ let slf = PyArrayRef :: extract ( slf. as_any ( ) . as_borrowed ( ) ) ?. into_inner ( ) ;
430434 let inner = compare ( & * slf, & * other, Operator :: Gte ) ?;
431435 Ok ( PyArrayRef :: from ( inner) )
432436 }
433437
434438 ///Rust docs are *not* copied into Python for __gt__: https://github.com/PyO3/pyo3/issues/4326
435439 fn __gt__ ( slf : Bound < Self > , other : PyArrayRef ) -> PyResult < PyArrayRef > {
436- let slf = PyArrayRef :: extract_bound ( slf. as_any ( ) ) ?. into_inner ( ) ;
440+ let slf = PyArrayRef :: extract ( slf. as_any ( ) . as_borrowed ( ) ) ?. into_inner ( ) ;
437441 let inner = compare ( & * slf, & * other, Operator :: Gt ) ?;
438442 Ok ( PyArrayRef :: from ( inner) )
439443 }
@@ -467,7 +471,7 @@ impl PyArray {
467471 /// ]
468472 /// ```
469473 fn filter ( slf : Bound < Self > , mask : PyArrayRef ) -> PyResult < PyArrayRef > {
470- let slf = PyArrayRef :: extract_bound ( slf. as_any ( ) ) ?. into_inner ( ) ;
474+ let slf = PyArrayRef :: extract ( slf. as_any ( ) . as_borrowed ( ) ) ?. into_inner ( ) ;
471475 let mask = ( & * mask as & dyn Array ) . to_bool ( ) . to_mask_fill_null_false ( ) ;
472476 let inner = vortex:: compute:: filter ( & * slf, & mask) ?;
473477 Ok ( PyArrayRef :: from ( inner) )
@@ -546,7 +550,7 @@ impl PyArray {
546550 // TODO(ngates): return a vortex.Scalar
547551 fn scalar_at ( slf : Bound < Self > , index : usize ) -> PyResult < Bound < PyScalar > > {
548552 let py = slf. py ( ) ;
549- let slf = PyArrayRef :: extract_bound ( slf. as_any ( ) ) ?. into_inner ( ) ;
553+ let slf = PyArrayRef :: extract ( slf. as_any ( ) . as_borrowed ( ) ) ?. into_inner ( ) ;
550554 PyScalar :: init ( py, slf. scalar_at ( index) )
551555 }
552556
@@ -592,7 +596,7 @@ impl PyArray {
592596 /// ]
593597 /// ```
594598 fn take ( slf : Bound < Self > , indices : PyArrayRef ) -> PyResult < PyArrayRef > {
595- let slf = PyArrayRef :: extract_bound ( slf. as_any ( ) ) ?. into_inner ( ) ;
599+ let slf = PyArrayRef :: extract ( slf. as_any ( ) . as_borrowed ( ) ) ?. into_inner ( ) ;
596600
597601 if !indices. dtype ( ) . is_int ( ) {
598602 return Err ( PyValueError :: new_err ( format ! (
@@ -608,7 +612,7 @@ impl PyArray {
608612
609613 #[ pyo3( signature = ( start, end) ) ]
610614 fn slice ( slf : Bound < Self > , start : usize , end : usize ) -> PyResult < PyArrayRef > {
611- let slf = PyArrayRef :: extract_bound ( slf. as_any ( ) ) ?. into_inner ( ) ;
615+ let slf = PyArrayRef :: extract ( slf. as_any ( ) . as_borrowed ( ) ) ?. into_inner ( ) ;
612616 let inner = slf. slice ( start..end) ;
613617 Ok ( PyArrayRef :: from ( inner) )
614618 }
@@ -643,14 +647,14 @@ impl PyArray {
643647 ///
644648 /// Compressed arrays often have more complex, deeply nested encoding trees.
645649 fn display_tree ( slf : & Bound < Self > ) -> PyResult < String > {
646- Ok ( PyArrayRef :: extract_bound ( slf. as_any ( ) ) ?
650+ Ok ( PyArrayRef :: extract ( slf. as_any ( ) . as_borrowed ( ) ) ?
647651 . display_tree ( )
648652 . to_string ( ) )
649653 }
650654
651655 fn serialize ( slf : & Bound < Self > , ctx : & PyArrayContext ) -> PyResult < Vec < Vec < u8 > > > {
652656 // FIXME(ngates): do not copy to vec, use buffer protocol
653- let array = PyArrayRef :: extract_bound ( slf. as_any ( ) ) ?;
657+ let array = PyArrayRef :: extract ( slf. as_any ( ) . as_borrowed ( ) ) ?;
654658 Ok ( array
655659 . serialize ( ctx, & Default :: default ( ) ) ?
656660 . into_iter ( )
@@ -666,7 +670,7 @@ impl PyArray {
666670 slf : & ' py Bound < ' py , Self > ,
667671 ) -> PyResult < ( Bound < ' py , PyAny > , Bound < ' py , PyAny > ) > {
668672 let py = slf. py ( ) ;
669- let array = PyArrayRef :: extract_bound ( slf. as_any ( ) ) ?. into_inner ( ) ;
673+ let array = PyArrayRef :: extract ( slf. as_any ( ) . as_borrowed ( ) ) ?. into_inner ( ) ;
670674
671675 let mut encoder = MessageEncoder :: default ( ) ;
672676 let buffers = encoder. encode ( EncoderMessage :: Array ( & * array) ) ;
@@ -698,7 +702,7 @@ impl PyArray {
698702 return Self :: __reduce__ ( slf) ;
699703 }
700704
701- let array = PyArrayRef :: extract_bound ( slf. as_any ( ) ) ?. into_inner ( ) ;
705+ let array = PyArrayRef :: extract ( slf. as_any ( ) . as_borrowed ( ) ) ?. into_inner ( ) ;
702706
703707 let mut encoder = MessageEncoder :: default ( ) ;
704708 let array_buffers = encoder. encode ( EncoderMessage :: Array ( & * array) ) ;
0 commit comments