Używam cython do ujawnienia biblioteki C++ do Pythona, poprzez umieszczenie wszystkich obiektów opakowania i funkcji w module wewnętrznym _pydynd
, a następnie poddanie ich działaniu innego modułu pythona.
Chciałbym kontrolować nazwę modułu i klasy, które pojawiają się w tych klasach rozszerzeń, na przykład zamiast dynd.nd.array
, zamiast _pydynd.w_array
, która jest wewnętrzną nazwą klasy opakowania. Czy cyton ma mechanizm, aby to zrobić?Jak kontrolować moduł/nazwę klasy cdhon cython?
Miałem nadzieję znaleźć coś podobnego do tego, jak można zmienić nazwy funkcji C/C++ podczas pisania ich definicji, ale moje wyszukiwania wyszły na sucho. Wygenerowany kod C++, które powinny być różne jest tp_name
linia tutaj:
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:
Jeśli staram się bezpośrednio zmienić nazwy przedmiotów, oto co się dzieje:
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'
Tak, robię takie rzeczy już, ale chcę __name__ i __module__ być różne na obiektach, więc dopasować się ze społeczeństwem interfejs – mwiebe