Вы можете просто использовать приведение в вашем коде C для этой цели:
PyUnicodeObject *p = ...whatever...;
callsomefun((PyObject*)p);
Все различные конкретные конкретные типы PyWhateverObject
можно рассматривать как «производные от» PyObject. Теперь в C нет понятия наследования, поэтому в нем нет «производного», но виртуальная машина Python синтезирует его очень просто, гарантируя, что первый член структуры каждого такого объекта (или первый член первого члена, или ...) является PyObject
struct (для этого есть макрос). Это гарантирует, что обычное приведение C-указателей (хотя технически «рискованно», так как компилятор не может проверить эту правильность - если вы приведете не то, что произойдет, вы просто потерпите крах во время выполнения ;-), работает правильно, если используется правильно между указателем на PyObject и любой указатель на конкретную, конкретную структуру типа Python.