@@ -117,7 +117,9 @@ func (obj Object) AttrFunc(name string) Func {
117117
118118func (obj Object ) SetAttr (name string , value any ) {
119119 cname := AllocCStr (name )
120- C .PyObject_SetAttrString (obj .obj , cname , From (value ).obj )
120+ r := C .PyObject_SetAttrString (obj .obj , cname , From (value ).obj )
121+ C .PyErr_Print ()
122+ check (r == 0 , fmt .Sprintf ("failed to set attribute %s" , name ))
121123 C .free (unsafe .Pointer (cname ))
122124}
123125
@@ -294,38 +296,21 @@ func ToValue(obj Object, v reflect.Value) bool {
294296 if ! v .IsValid () || ! v .CanSet () {
295297 return false
296298 }
299+
297300 switch v .Kind () {
298- case reflect .Int8 :
299- fallthrough
300- case reflect .Int16 :
301- fallthrough
302- case reflect .Int32 :
303- fallthrough
304- case reflect .Int64 :
305- fallthrough
306- case reflect .Int :
301+ case reflect .Int8 , reflect .Int16 , reflect .Int32 , reflect .Int64 , reflect .Int :
307302 if obj .IsLong () {
308303 v .SetInt (Cast [Long ](obj ).Int64 ())
309304 } else {
310305 return false
311306 }
312- case reflect .Uint8 :
313- fallthrough
314- case reflect .Uint16 :
315- fallthrough
316- case reflect .Uint32 :
317- fallthrough
318- case reflect .Uint64 :
319- fallthrough
320- case reflect .Uint :
307+ case reflect .Uint8 , reflect .Uint16 , reflect .Uint32 , reflect .Uint64 , reflect .Uint :
321308 if obj .IsLong () {
322309 v .SetUint (Cast [Long ](obj ).Uint64 ())
323310 } else {
324311 return false
325312 }
326- case reflect .Float32 :
327- fallthrough
328- case reflect .Float64 :
313+ case reflect .Float32 , reflect .Float64 :
329314 if obj .IsFloat () || obj .IsLong () {
330315 v .SetFloat (Cast [Float ](obj ).Float64 ())
331316 } else {
@@ -407,62 +392,6 @@ func ToValue(obj Object, v reflect.Value) bool {
407392 return true
408393}
409394
410- func To [T any ](obj Object ) (ret T ) {
411- switch any (ret ).(type ) {
412- case int8 :
413- return any (int8 (Cast [Long ](obj ).Int64 ())).(T )
414- case int16 :
415- return any (int16 (Cast [Long ](obj ).Int64 ())).(T )
416- case int32 :
417- return any (int32 (Cast [Long ](obj ).Int64 ())).(T )
418- case int64 :
419- return any (Cast [Long ](obj ).Int64 ()).(T )
420- case int :
421- return any (int (Cast [Long ](obj ).Int64 ())).(T )
422- case uint8 :
423- return any (uint8 (Cast [Long ](obj ).Uint64 ())).(T )
424- case uint16 :
425- return any (uint16 (Cast [Long ](obj ).Uint64 ())).(T )
426- case uint32 :
427- return any (uint32 (Cast [Long ](obj ).Uint64 ())).(T )
428- case uint64 :
429- return any (Cast [Long ](obj ).Uint64 ()).(T )
430- case uint :
431- return any (uint (Cast [Long ](obj ).Uint64 ())).(T )
432- case float32 :
433- return any (float32 (Cast [Float ](obj ).Float64 ())).(T )
434- case float64 :
435- return any (Cast [Float ](obj ).Float64 ()).(T )
436- case complex64 :
437- return any (complex64 (Cast [Complex ](obj ).Complex128 ())).(T )
438- case complex128 :
439- return any (Cast [Complex ](obj ).Complex128 ()).(T )
440- case string :
441- return any (Cast [Str ](obj ).String ()).(T )
442- case bool :
443- return any (Cast [Bool ](obj ).Bool ()).(T )
444- case []byte :
445- return any (Cast [Bytes ](obj ).Bytes ()).(T )
446- default :
447- v := reflect .ValueOf (ret )
448- switch v .Kind () {
449- case reflect .Slice :
450- return toSlice [T ](obj , v )
451- }
452- panic (fmt .Errorf ("unsupported type conversion from Python object to %T" , ret ))
453- }
454- }
455-
456- func toSlice [T any ](obj Object , v reflect.Value ) T {
457- list := Cast [List ](obj )
458- l := list .Len ()
459- v = reflect .MakeSlice (v .Type (), l , l )
460- for i := 0 ; i < l ; i ++ {
461- v .Index (i ).Set (reflect .ValueOf (To [T ](list .GetItem (i ))))
462- }
463- return v .Interface ().(T )
464- }
465-
466395func fromSlice (v reflect.Value ) List {
467396 l := v .Len ()
468397 list := newList (C .PyList_New (C .Py_ssize_t (l )))
0 commit comments