为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

三国纷争 2019-11-20 14:36:53
常规问题:为什么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)。完整的追溯发布在下面。
查看完整描述

2 回答

?
饮歌长啸

TA贡献1951条经验 获得超3个赞

附上我可以从您的邮件中得到的答复。

  1. 在Cython中可以使用Python对象,但是一旦您使用了cdef某些部分,就会受到限制。尝试通过“联合国”-捍卫字典。

  2. 您所犯的错误表明您有一个表达式,x[y]其中x有一个元组和y一个int。原则上,它应该可以正常工作(用int应该为一个元组建立索引就可以了)。因此,您可以查看Cython中的方括号,以了解其来源。

  3. 您提到删除了pxd文件。然后,您是否将扩展类/其他类型定义的完整声明移至pyx文件?


查看完整回答
反对 回复 2019-11-20
?
胡说叔叔

TA贡献1804条经验 获得超8个赞

扩展类型在编译中不是问题(至少在与主要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中可能会发现不兼容的地方


查看完整回答
反对 回复 2019-11-20
  • 2 回答
  • 0 关注
  • 408 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信