// decodeType translates a Python object to a Go value. Its type must be // non-zero. func decodeType(pyType C.int, pyValue *C.PyObject) (value interface{}, err error) { switch pyType { case 0: err = getError() case 1: // nil case 2: value = false case 3: value = true case 4: value = C.GoString(C.PyString_AsString(pyValue)) case 5: value = int(C.PyInt_AsLong(pyValue)) case 6: var overflow C.int i := int64(C.PyLong_AsLongLongAndOverflow(pyValue, &overflow)) switch overflow { case -1: err = fmt.Errorf("Python integer %s is too small", stringify(pyValue)) case 0: value = i case 1: n := uint64(C.PyLong_AsUnsignedLongLong(pyValue)) if n == 0xffffffffffffffff { C.PyErr_Clear() err = fmt.Errorf("Python integer %s is too large", stringify(pyValue)) } else { value = n } } case 7: value = float64(C.PyFloat_AsDouble(pyValue)) case 8: value = complex(C.PyComplex_RealAsDouble(pyValue), C.PyComplex_ImagAsDouble(pyValue)) case 9: return decodeSequence(pyValue) case 10: return decodeMapping(pyValue) default: err = fmt.Errorf("unable to translate %s from Python", stringify(C.PyObject_Type(pyValue))) return } return }
// double PyFloat_AsDouble(PyObject *pyfloat) // Return a C double representation of the contents of pyfloat. If pyfloat is not a Python floating point object but has a __float__() method, this method will first be called to convert pyfloat into a float. func PyFloat_AsDouble(self *PyObject) float32 { return float32(C.PyFloat_AsDouble(topy(self))) }
func (f *Float) Float64() float64 { return float64(C.PyFloat_AsDouble(c(f))) }
func (f *Float) Float() float64 { return float64(C.PyFloat_AsDouble(f.c())) }