#
6.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; use `PyErr_Occurred()` to detect an error. 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 `Py_BuildValue()` 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 `Py_BuildValue()` 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)
  Delete the mapping for key from o. Returns `-1` on failure. This is the equivalent of the Python statement "`del o[key]`".