The py3c Cheatsheet¶
Strings¶
PyStr_* – for human-readable strings
PyBytes_* – for binary data
PyUnicode_* – when you used
unicode
in Python 2PyString_* – 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.