Как добавить рукописный метод CPython в мой класс SWIG - PullRequest
1 голос
/ 29 февраля 2020

У меня есть класс C ++, который упакован для Python с использованием SWIG -builtin. Я хотел бы добавить метод к этому классу, который обернут в чистый CPython, например, я хочу это в моем списке методов:

{ "handRolledCall", (PyCFunction) _wrap_MyClass_handRolledCall, METH_NOARGS, (char *) "" },

, где я определил _wrap_MyClass_handRolledCall() , Я могу подойти довольно близко, используя% extension:

%extend MyClass {
     PyObject* handRolledCall(PyObject* arg1, PyObject* arg2) {
         // access the C++ value of self with $self
     }
}

Но это всегда съедает значение Python PyObject self. Это означает, что нет способа манипулировать состоянием Python объекта ввода, например, если я хочу добавить его в коллекцию.

Я также пытался использовать% native, как предложено в Добавить ручной метод к выводу Swig . Но это касается свободных функций и не предоставляет способа добавления методов в существующий класс.

Поскольку я использую SWIG -builtin, я не могу monkeypatch на стороне Python. Мой вариант использования генерирует Python __enter__ методы для некоторых классов, которые должны действовать как менеджеры контекста.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...