# 8.1 Object Protocol

int `PyObject_Print`(PyObject *o, FILE *fp, int flags)
  Print an object `o`, on file `fp`. Returns -1 on error The flags argument is used to enable certain printing options. The only option currently supported is `Py_Print_RAW`.

int `PyObject_HasAttrString`(PyObject *o, char *attr_name)
  Returns 1 if o has the attribute attr_name, and 0 otherwise. This is equivalent to the Python expression: `hasattr(o,attr_name)`. This function always succeeds.

PyObject* `PyObject_GetAttrString`(PyObject *o, char *attr_name)
  Retrieve an attribute named attr_name from object o. Returns the attribute value on success, or NULL on failure. This is the equivalent of the Python expression: `o.attr_name`.

int `PyObject_HasAttr`(PyObject *o, PyObject *attr_name)
  Returns 1 if o has the attribute attr_name, and 0 otherwise. This is equivalent to the Python expression: `hasattr(o,attr_name)`. This function always succeeds.

PyObject* `PyObject_GetAttr`(PyObject *o, PyObject *attr_name)
  Retrieve an attribute named attr_name from object o. Returns the attribute value on success, or NULL on failure. This is the equivalent of the Python expression: o.attr_name.

int `PyObject_SetAttrString`(PyObject *o, char *attr_name, PyObject *v)
  Set the value of the attribute named `attr_name`, for object `o`, to the value `v`. Returns -1 on failure. This is the equivalent of the Python statement: `o.attr_name=v`.

int `PyObject_SetAttr`(PyObject *o, PyObject *attr_name, PyObject *v)
  Set the value of the attribute named `attr_name`, for object `o`, to the value `v`. Returns -1 on failure. This is the equivalent of the Python statement: `o.attr_name=v`.

int `PyObject_DelAttrString`(PyObject *o, char *attr_name)
  Delete attribute named `attr_name`, for object `o`. Returns -1 on failure. This is the equivalent of the Python statement: `del o.attr_name`.

int `PyObject_DelAttr`(PyObject *o, PyObject *attr_name)
  Delete attribute named `attr_name`, for object `o`. Returns -1 on failure. This is the equivalent of the Python statement: `del o.attr_name`.

int `PyObject_Cmp`(PyObject *o1, PyObject *o2, int *result)
  Compare the values of `o1` and `o2` using a routine provided by `o1`, if one exists, otherwise with a routine provided by `o2`. The result of the comparison is returned in `result`. Returns -1 on failure. This is the equivalent of the Python statement: `result=cmp(o1,o2)`.

int `PyObject_Compare`(PyObject *o1, PyObject *o2)
  Compare the values of `o1` and `o2` using a routine provided by `o1`, if one exists, otherwise with a routine provided by `o2`. Returns the result of the comparison on success. On error, the value returned is undefined. This is equivalent to the Python expression: `cmp(o1,o2)`.

PyObject* `PyObject_Repr`(PyObject *o)
  Compute the string representation of object, `o`. Returns the string representation on success, NULL on failure. This is the equivalent of the Python expression: `repr(o)`. Called by the `repr()` built-in function and by reverse quotes.

PyObject* `PyObject_Str`(PyObject *o)
  Compute the string representation of object, `o`. Returns the string representation on success, NULL on failure. This is the equivalent of the Python expression: `str(o)`. Called by the `str()` built-in function and by the `print` statement.

int `PyCallable_Check`(PyObject *o)
  Determine if the object `o`, is callable. Return 1 if the object is callable and 0 otherwise. This function always succeeds.

PyObject* `PyObject_CallObject`(PyObject *callable_object, PyObject *args)
  Call a callable Python object `callable_object`, with arguments given by the tuple `args`. If no arguments are needed, then args may be NULL. Returns the result of the call on success, or NULL on failure. This is the equivalent of the Python expression: `apply(o, args)`.

PyObject* `PyObject_CallFunction`(PyObject *callable_object, char *format, ...)
  Call a callable Python object `callable_object`, with a variable number of C arguments. The C arguments are described using a mkvalue-style format string. The format may be NULL, indicating that no arguments are provided. Returns the result of the call on success, or NULL on failure. This is the equivalent of the Python expression: `apply(o,args)`.

PyObject* `PyObject_CallMethod`(PyObject *o, char *m, char *format, ...)
  Call the method named `m` of object `o` with a variable number of C arguments. The C arguments are described by a mkvalue format string. The format may be NULL, indicating that no arguments are provided. Returns the result of the call on success, or NULL on failure. This is the equivalent of the Python expression: `o.method(args)`. Note that Special method names, such as "`__add__`", "`__getitem__`", and so on are not supported. The specific abstract-object routines for these must be used.

int `PyObject_Hash`(PyObject *o)
  Compute and return the hash value of an object `o`. On failure, return -1. This is the equivalent of the Python expression: `hash(o)`.

int `PyObject_IsTrue`(PyObject *o)
  Returns 1 if the object `o` is considered to be true, and 0 otherwise. This is equivalent to the Python expression: `not not o`. This function always succeeds.

PyObject* `PyObject_Type`(PyObject *o)
  On success, returns a type object corresponding to the object type of object `o`. On failure, returns NULL. This is equivalent to the Python expression: `type(o)`.

int `PyObject_Length`(PyObject *o)
  Return the length of object `o`. If the object `o` provides both sequence and mapping protocols, the sequence length is returned. On error, -1 is returned. This is the equivalent to the Python expression: `len(o)`.

PyObject* `PyObject_GetItem`(PyObject *o, PyObject *key)
  Return element of `o` corresponding to the object `key` or NULL on failure. This is the equivalent of the Python expression: `o[key]`.

int `PyObject_SetItem`(PyObject *o, PyObject *key, PyObject *v)
  Map the object `key` to the value `v`. Returns -1 on failure. This is the equivalent of the Python statement: `o[key]=v`.

int `PyObject_DelItem`(PyObject *o, PyObject *key, PyObject *v)
  Delete the mapping for `key` from `*o`. Returns -1 on failure. This is the equivalent of the Python statement: `del o[key]`.