程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

有没有办法使用不是函数参数的融合类型?

发布于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黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

23 0
收藏该文
已收藏

评论内容:(最多支持255个字符)