如何控制cython cdef类的模块/名称?

2024-10-02 00:34:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用Cython来将C++库暴露为Python,通过将所有包装器对象和函数放在内部模块^ {CD1>}中,然后通过不同的Python模块公开这些文件。 我想控制出现在这些扩展类中的模块和类的名称,例如看起来像dynd.nd.array,而不是{},这是包装类的内部名称。cython有这样的机制吗?在

我希望找到类似的方法,当你写下他们的定义时,你可以重命名C/C++函数,但是我的搜索结果已经变干了。生成的C++代码应该不同,这里的^ {< CD4}}行:

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*/

更新:

如果我尝试直接重命名对象,会发生以下情况:

^{pr2}$

Tags: 模块文件对象函数名称arraycython重命名
2条回答

Cython-0.21似乎使用.pyx文件相对于__init__.py文件的位置来设置模块名。在

用于文件布局

jmap/__init__.py
jmap/client.pyx

cython编译器的输出包括

^{pr2}$

移动__init__.py的位置会更改此值。这些信息可能在Cython文档中,但我找不到。在

讨论

这对于正确获取正确的pickle类非常重要。具体来说,模块的名称概念应该与导入方式对称。这看起来很明显,但在cython中很容易被打破。在

很好

>>> from jmap.client import JMapError
>>> JMapError
<class 'jmap.client.JMapError'>

坏的

>>> import jmap
>>> jmap.JMapError
<class 'Client.client.JMapError'>

对于您的问题,我有一个部分的解决方案,您可以移动或者我们应该说更好的方法是将内容导入到您的uuinit_uuy文件中的专用命名空间。在

首先,您有一个lib,它包含以下内容:

module.libname.A (A is a class for e.g. or anything else)
module.libname.B
...

现在我通过复制这些东西创建了我自己的lib。在您的新模块中找到的\uuuinit_uu.py中,您可以执行以下操作:

^{pr2}$

如果您迭代vars(library)中的内容,您也可以重命名这些内容本身,但到目前为止我还没有尝试过。update()需要一个字典,您可以传递一个您在布局中选择的字典。在

您可以在控制台上使用(我认为这是一个适合您的解决方案):

 import(libName)
 globals().update({"testMe":vars(libName)["A"]}) # A is your class name from the library
 # then you can do:
 testMe
 # in my case this outputs something like this: <class 'libName.A'>

PS:我使用boost::python来公开我的类,但它只是cpython东西的包装器。在

相关问题 更多 >

    热门问题