# The py3c Cheatsheet

## Strings

- PyStr_* – for human-readable strings

- PyBytes_* – for binary data

- PyUnicode_* – when you used `unicode` in Python 2

- PyString_* – when you don’t care about Python 3 yet

Use PyStr_AsUTF8AndSize to get a char* and its length.

## Ints

Use whatever you used in Python 2. For py3-only code, use `PyLong`.

## Floats

Don’t pass the useless second argument to `PyFloat_FromString()` as you needed to do in Python 2.

## Comparisons

Use rich comparisons:

    static PyObject* mytype_richcmp(PyObject *obj1, PyObject *obj2, int op)
    {
        if (mytype_Check(obj2)) {
            PY_RETURN_RICHCOMPARE(get_data(obj1), get_data(obj2), op);
        }
        Py_RETURN_NOTIMPLEMENTED;
    }

    .tp_richcompare = mytype_richcmp

## Objects & Types

Instead of | use
--- | ---
obj->ob_type | Py_TYPE(obj)
obj->ob_refcnt | Py_REFCNT(obj)
obj->ob_size | Py_SIZE(obj)
PyVarObject_HEAD_INIT(NULL, 0) | PyObject_HEAD_INIT(NULL), 0

## Module initialization

    static struct PyModuleDef moduledef = {
        PyModuleDef_HEAD_INIT,
        .m_name = "spam",
        .m_doc = PyDoc_STR("Python wrapper for the spam submodule."),
        .m_size = -1,
        .m_methods = spam_methods,
    };

    MODULE_INIT_FUNC(name)
    {
        ...
        m = PyModule_Create(&moduledef);
        ...
        if (error) {
            return NULL;
        }
        ...
        return m;
    }

## CObject

Use the PyCapsule API. If you need to support 2.6, see the chapter PyCapsule API for Python 2.6.