发布于2020-01-16 10:33 阅读(1112) 评论(0) 点赞(23) 收藏(4)
考虑以下cython片段:
ctypedef fused number:
int
double
cdef void some_function(void *in_, void *out):
cdef number *fin = <number *> in_
cdef number *fout = <number *> out
if number is int:
fout[0] = fin[0] + fin[1]
else:
fout[0] = fin[0] * fin[1]
试图用cythonize抛出:
Invalid use of fused types, type cannot be specialized
解决此问题的一种方法是将融合类型添加到函数的签名中:
cdef void some_function(void *in_, void *out, number *dummy):
...
etc.
这可以很好地翻译,但是非常丑陋和不令人满意。
有没有更好的办法?
我对Cython代码的理解非常有限,但是我发现没有证据表明可以在其参数中没有至少一个融合类型的情况下定义融合函数。
例如在FusedNode.py中说:
该节点用融合参数替换函数。
我无法仅在测试套件中的函数内找到任何具有融合类型的测试,并且众所周知,文档中对此没有任何规定。
自然地,缺少证明不是没有证据。我希望有人能证明我错了。在此期间,我将稍作调整来使用您的工作-我将通过索引选择类型,而不是实际传递变量:
%%cython
cdef void some_function(number *dummy=NULL):
if number is int:
print("I'm int")
else:
print("I'm float")
def call_it():
some_function[double]() #picking via the type indexing
对于def
函数,可以(错误地)使用键入的内存视图:
%%cython
def other_function(number[:] dummy=None):
if number is int:
print("I'm int")
else:
print("I'm float")
现在:
import cython
other_function[cython.int]()
作者:黑洞官方问答小能手
链接:https://www.pythonheidong.com/blog/article/224256/ab2437d5e77dd40b474b/
来源:python黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 python黑洞网 All Rights Reserved 版权所有,并保留所有权利。 京ICP备18063182号-1
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!