验证编译扩展类型的兼容性,并将其与cdef一起使用

常规问题:

为什么Cython编译中的其他错误指向特定的错误行,而并非如此?

更新之前:

由于难以编译扩展类型,如下面的“不会编译”链接中所述,人们认为AssertionError与扩展类型有关(在实例化传输到主pyx文件之后)。


该论坛帖子中的某人说:“如果您确实需要扩展类型,并想在代码中声明其类型,则需要在.pxd文件中声明其C属性。”


如果在这种情况下是正确的,则问题是使用pxd文件时pyx文件不会为我编译。在一个pyx文件中编译扩展名类型时没有错误,但是extTypeName is not a type identifier当导入后使用扩展名类型时,我收到错误消息。


在评论中告诉我,可以在pyx文件中使用主要功能定义扩展类型。这样做时,我收到一个错误,我不知道如何跟踪(AssertionError: unexpected type int and base type tuple object for indexing)。完整的追溯发布在下面。


三国纷争
浏览 410回答 2
2回答

饮歌长啸

附上我可以从您的邮件中得到的答复。在Cython中可以使用Python对象,但是一旦您使用了cdef某些部分,就会受到限制。尝试通过“联合国”-捍卫字典。您所犯的错误表明您有一个表达式,x[y]其中x有一个元组和y一个int。原则上,它应该可以正常工作(用int应该为一个元组建立索引就可以了)。因此,您可以查看Cython中的方括号,以了解其来源。您提到删除了pxd文件。然后,您是否将扩展类/其他类型定义的完整声明移至pyx文件?

胡说叔叔

扩展类型在编译中不是问题(至少在与主要cdef函数位于同一pyx文件中声明时);该错误发生在其他地方。已解决:AssertionError是由对该元组的简单索引访问引起的。元组声明为:cdef:    tuple curIRs…并在嵌套循环中设置为:for deriv1 in xrange(len(L1)):    for deriv2 in xrange(len(L2)):        curIRs = (deriv2, deriv1)…并访问元组索引:d1[ix] = (curIRs[0], curIRs[1])这显然是无害的监督,curIRs不仅仅被存储,而是实质上通过索引访问来复制它。但是,这是由于未知原因而发生错误的地方:当(curIRs [0],curIRs [1])替换为curIRs时,将AssertionError停止。如评论中所述,由于pyx文件中的main函数是在python脚本中调用的,因此无法使用cdef对其进行定义。Pierre de Buyl在评论中的建议非常有帮助:“删除潜在问题变量的cdef声明,直到错误解决。” 即在Python中可能没有错误的地方,Cython中可能会发现不兼容的地方
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python