栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Cython:Python类包装器中的模板

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Cython:Python类包装器中的模板

正如您所说,Cython并不真正支持这一点。

我认为到目前为止,最简单的方法就是使用字符串替换手动生成一堆Cython文件。从“ foowrapper.pxi.src”文件(您想要的名称…)开始:

cdef class PyFoo_{T}:  cdef Foo[{T}] *thisptr  def __cinit__(self, param):    self.thisptr = new Foo[{T}](param)    # etc

接下来,通过一个简单的程序(也可能是Python)运行它以加载文件,进行字符串替换并以新名称再次保存文件。关键是:

output = pre.format(T=T) # where T is a string with a C++ class name    # e.g. "int" or "std::vector<double>"

(显然,有一些关于加载和保存的代码已被我懒洋洋地跳过了)

然后,在您的Cython文件中,您只需“包括”每个类的生成文件。Cython中的“
include”命令是文字文本包含(如C预处理程序),并且需要一个.pxi文件:

cdef extern from "header.h":    cdef cppclass Foo[T]:        Foo(T param)        # ...include "foowrapper_int.pxi"include "foowrapper_vectordouble.pxi# etc

您必须选择在编译时生成的类,但这是不可避免的(模板是编译时功能),因此您将永远无法从Python脚本环境动态生成它们,因为赢得了相应的C ++类无法生成。

其他选择

其他几个选项值得简要考虑。首先,您可以继承不依赖于模板参数

Foo<T>
的基类(例如
Foobase
)。然后
Foobase
,您需要包装Cython(为您关心的情况生成类似构造函数的函数)。仅当要调用的函数没有依赖于模板类型的参数时,这才真正可行。显然,这还涉及更改C
++代码。

section选项用于查看另一种包装方式。Boost Python肯定会对此提供本地支持(但有其自身的缺点)。我想SIP /
SWIG也可以应付(但我不知道)。必要时,您可以将它们与Cython完美地混合搭配(通过导入包含模板类的生成模块)。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/639659.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号