// 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 }
// PyObject* PyObject_Type(PyObject *o) // Return value: New reference. // When o is non-NULL, returns a type object corresponding to the object type of object o. On failure, raises SystemError and returns NULL. This is equivalent to the Python expression type(o). This function increments the reference count of the return value. There’s really no reason to use this function instead of the common expression o->ob_type, which returns a pointer of type PyTypeObject*, except when the incremented reference count is needed. func (self *PyObject) Type() *PyObject { return togo(C.PyObject_Type(topy(self))) }