首页 > 解决方案 > Cython:可以在函数签名中声明列表项类型吗?

问题描述

我正在使用 Cython,我想声明一个函数,其参数是一个包含 cdef 类实例的列表。我遵循了文档,并且还找到了一种基于使用局部变量使其工作的解决方法。但是,我想直接在函数签名中声明列表中项目的类型。这有可能吗?

作为一个简单的示例,请考虑以下扩展类型。

cdef class Shrubbery:
    cdef int width, height
    cdef float depth

现在假设,我想定义一个使用该 cdef 类的实例作为输入的函数。我可以这样做:

cdef widen_shrubbery(Shrubbery sh, extra_width):
    sh.width = sh.width + extra_width

函数签名中的类型声明Shrubbery是访问 cdef 类的属性所必需的,因为 Cython 编译器必须知道它是该类型的实例而不是通用 Python 对象。

现在假设,我想定义一个函数,该函数使用该 cdef 类的实例列表作为输入。我的解决方法是在函数内部定义一个局部变量的解决方案,如下所示:

cdef widen_shrubberies(list_of_sh, extra_width):
    cdef Shrubbery sh
    for i in len(list_of_sh):
        sh = list_of_sh[i]
        sh.width = sh.width + extra_width

但我想知道是否可以避免使用局部变量,而是Shrubbery直接在函数的签名中声明包含实例的列表。可能吗?我该怎么做呢?

下面的代码并没有削减它:

cdef widen_shrubberies(list Shrubbery list_of_sh, extra_width):
    for sh in list_of_sh:
        sh.width = sh.width + extra_width

标签: pythoncythontype-declaration

解决方案


推荐阅读