有没有一种方法可以使用不是函数参数的熔合类型?

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]

尝试将此内容进行Cython化会引发以下错误:
Invalid use of fused types, type cannot be specialized

解决这个问题的一种方法是将融合类型添加到函数的签名中:

cdef void some_function(void *in_, void *out, number *dummy):
...
etc.

这段文本可以翻译,但很难看且不令人满意。

有没有更好的方法呢?

1个回答

3
我的对Cython代码的理解非常有限,但我没有发现任何证据表明可以在未至少有一个融合类型作为其参数的情况下定义融合函数。
例如,在FusedNode.py中,它说:
此节点使用融合参数替换函数。
我无法在测试套件中找到仅在函数内部具有融合类型的任何测试,并且正如您所知,文档中没有关于它的任何内容。
自然地,缺乏证据并不是缺乏证据。我希望有人能证明我是错误的。与此同时,我将使用您的解决方法进行微调 - 我会通过indexing选择类型,而不是真正传递变量。
%%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]()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接