J'essaye de créer une wrapper pour une API C++ grâce à Cython, et j'ai
un petit problème de design. Actuellement, le code ressemble à ceci :
###########################################################
### spam.hpp (C++)
# class Spam
# {
# int a,b;
#
# Spam (int a, int b);
# ~Spam();
# bool isOK();
#
# static Spam getSpam();
# }
###
cdef extern from "spam.hpp":
ctypedef struct c_Spam "Spam":
int a,b
bool isOK()
c_Spam *newSpam "new Spam" (int a, int b)
void del_Spam "delete" ()
c_Spam c_getSpam "getSpam" ()
cdef class Spam:
# Static methods
@staticmethod
def getSpam(cls):
cdef Spam s
s = Spam()
def __cinit__(self, int a, int b):
self.this = new_Spam(a,b)
def __dealloc__(self):
del_Spam(self.this)
def isOK(self):
return self.this.isOK()
#Properties
property a :
def __get__(self): return self.this.a
def __set__(self, a): self.this.a = a
###########################################################
Mon problème se trouve au niveau de la méthode statique : c'est une
factory (en C++), donc elle me retourne une instance.
Pour créer le wrapper, j'ai un petit workaround qui consiste à créer une
instance, supprimer l'objet C++ alloué et le remplacer par l'instance
retournée : c'est la méthode setthis (c'est une méthode cdef, elle n'est
pas accessible depuis python).
Je trouve ça particulièrement malfichu, mais je n'ai pas su faire mieux.