Python: травление c объектов

Во-первых, я не ожидаю решения, просто надеясь на некоторые указания о том, как начать.

У меня есть программа на языке C со встроенным интерпретатором Python. Сценарии Python, которые программа использует в качестве входных данных, явно относятся к C-определенным объектам и функциям. Теперь я хотел бы сделать некоторые из этих объектов разборчивыми.

В документах pickle описывается, как типы расширений можно сделать picklable с помощью __reduce__. Но это метод Python - как бы определить его в базовом PyObject?

Я уверен, что я неправильно понимаю что-то...

Ответ 1

Модуль pickle поставляется как для python-only, так и для варианта C (называемый cPickle). Таким образом, метод __reduce__ должен быть вызван из кода Python.

Таким образом, вам необходимо предоставить запись __reduce__ в объекте C PyMethodDef struct с подходящей реализацией.

В качестве альтернативы вы также можете зарегистрировать функцию травления с помощью copy_reg module. Этот оригинальный исходный код модуля должен был лучше поддерживать модули расширения; исходный код для состояния модуля:

Это полезно только для добавления поддержки разбора для типов расширений, определенных в C, а не для экземпляров пользовательских классов.