【问题标题】:combine multiple decorators in cython在 cython 中组合多个装饰器
【发布时间】:2015-08-05 01:43:47
【问题描述】:

我在combine multiple decorators in python to a single decorator 上发现了这个有趣的问题。

我想在 Cython 中做同样的事情。通常,我的 Cython 代码如下所示:

@cython.boundscheck(False)
@cython.wraparound(False)
@cython.cdivision(True)
cdef ar[dtype_t, ndim=2] sma_vec(ar[dtype_t, ndim=2] x, int m):
    cdef int n
    cdef Py_ssize_t i, j
    ...

或喜欢

@cython.boundscheck(False)
@cython.wraparound(False)
@cython.cdivision(True)
cpdef ar[dtype_t, ndim=2] sma_vec(ar[dtype_t, ndim=2] x, int m):
    cdef int n
    cdef Py_ssize_t i, j
    ...

我倾向于在几乎所有地方重复这三个装饰器@cython.boundscheck(False)@cython.wraparound(False)@cython.cdivision(True)

该页面中给出的常规 Python 的解决方案是

def composed(*decs):
    def deco(f):
        for dec in reversed(decs):
            f = dec(f)
        return f
    return deco

对于 Cython,我尝试执行以下操作:

cdef composed_for_cdef(*decs):
     cdef deco(f):
          for dec in reversed(decs):
              f = dec(f)
           return f
      return deco

cpdef composed_for_cpdef(*decs):
     cpdef deco(f):
          for dec in reversed(decs):
              f = dec(f)
           return f
      return deco

但我在编译过程中遇到错误:

cdef composed_for_cdef(*decs):
    cdef deco(f):
               ^
------------------------------------------------------------

stat\movavg.pyx:12:16: C function definition not allowed here

我什至尝试了常规 Python 的解决方案(如上所示),但出现错误:

@composed(cython.boundscheck(False), cython.wraparound(False), cython.cdivision(True))
^
------------------------------------------------------------

stat\movavg.pyx:24:0: Cdef functions/classes cannot take arbitrary decorators.

【问题讨论】:

  • 考虑到 Cython 的装饰器如何与编译器交互,我认为您尝试做的事情是不可能的。这就像试图将所有 __future__ 导入放在一个模块中并 import * 以打开未来的语句。
  • cython 装饰器实际上是返回一个新的函数对象,还是增加参数然后返回它?
  • @Eric,我不确定我理解你的问题。

标签: python cython


【解决方案1】:

组合装饰器并不是这里的最佳方法。简单地说,添加,

# cython: boundscheck=False
# cython: cdivision=True
# cython: wraparound=False

在源文件的标题中(请参阅 Cython compiler directives),这些选项将应用于所有定义的函数。如有必要,可以使用适当的装饰器覆盖此默认行为。

关于组合装饰器问题,目前 Cython 似乎不支持此问题。例如,即使大部分是 Python 代码,

cpdef composed_for_cpdef(*decs):
   def deco(f):
       for dec in reversed(decs):
           f = dec(f)
       return f
   return deco

我在使用 Cython 0.22 编译 closures inside cpdef functions not yet supported 时遇到错误。

【讨论】:

  • 我需要在cimport cython 行之前还是之后添加这些标题?
猜你喜欢
  • 2019-01-28
  • 2016-12-25
  • 2015-02-22
  • 2017-11-30
  • 2016-07-26
  • 1970-01-01
  • 2019-05-13
  • 2021-03-12
  • 2013-06-15
相关资源
最近更新 更多