Sto usando cython per esporre una libreria C++ a python, inserendo tutti gli oggetti wrapper e le funzioni in un modulo interno _pydynd
, esponendoli a un altro modulo python.
Vorrei controllare il nome del modulo e della classe visualizzati in queste classi di estensione, ad esempio dynd.nd.array
, ad esempio invece di _pydynd.w_array
, che è il nome interno della classe wrapper. Cython ha un meccanismo per farlo?Come controllo il modulo/nome di una classe cdef cython?
Spero di trovare qualcosa di simile a come è possibile rinominare le funzioni C/C++ quando si scrivono le loro definizioni, ma le mie ricerche sono venute a mancare. Il codice generato C++ che dovrebbe essere diversa è la linea tp_name
qui:
static PyTypeObject __pyx_type_7_pydynd_w_array = {
PyVarObject_HEAD_INIT(0, 0)
__Pyx_NAMESTR("_pydynd.w_array"), /*tp_name*/
sizeof(struct __pyx_obj_7_pydynd_w_array), /*tp_basicsize*/
UPDATE:
Se provo rinominare direttamente gli oggetti, ecco cosa succede:
In [103]: nd.array.__name__
Out[103]: 'w_array'
In [104]: nd.array.__module__
Out[104]: 'dynd._pydynd'
In [105]: nd.array.__name__ = "array"
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-105-73d9172a0216> in <module>()
----> 1 nd.array.__name__ = "array"
TypeError: can't set attributes of built-in/extension type 'dynd._pydynd.w_array'
In [106]: nd.array.__module__ = "dynd.nd"
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-106-37f990658ede> in <module>()
----> 1 nd.array.__module__ = "dynd.nd"
TypeError: can't set attributes of built-in/extension type 'dynd._pydynd.w_array'
Sì, sto facendo le cose come questo già, ma voglio la __name__ e __module__ siano diverse sugli oggetti, in modo da abbinare con il pubblico interface – mwiebe