Cython不适用于带有参数的双修饰符。有解决方法吗?

时间:2019-05-10 16:40:50

标签: python cython python-decorators cythonize

我无法对python代码进行cythonization。我试图重现我遇到的最简单的错误情况。

这是我想进行cythonize的代码的说明:

     def some_decorator_with_arg(arg):
         def decorator(func):
             def wrapper(x):
                 return func(x) + arg
             return wrapper
         return decorator

     class some_class():
         def __init__(self):
             pass

         @staticmethod
         @some_decorator_with_arg(1)
         def some_method(a):
             return a
    print(some_class().some_method(1))        

这在纯python中没有问题。但是,当我对这些代码进行cythonize处理时,它将在运行时引发错误:

  

print(some_class()。some_method(1))

     

TypeError:wrapper()仅接受一个参数(给定2个参数)

编译运行没有问题。如果我写@some_decorator_with_arg(arg=1),则会收到另一个错误:

  

@some_decorator_with_arg(arg = 1)

     

TypeError:some_decorator_with_arg()不带关键字参数

有人知道解决此问题的方法吗?

1 个答案:

答案 0 :(得分:2)

我找到了解决问题的最简单方法-将两个(或多个)装饰器的功能合并为一个,然后cython不会出现问题。例如,对于上述情况,我将执行以下操作:

def some_decorator_with_arg(arg):
     def decorator(func):
         def wrapper(x):
             return func(x) + arg
         return wrapper
     return decorator

#combine the created decorator with the staticmethod functionality
def staticmethod_combined(*args,**kwargs):
    return lambda func: staticmethod(some_decorator_with_arg(*args,**kwargs)(func))

class some_class():
     def __init__(self):
         pass

     @staticmethod_combined(1)
     def some_method(a):
         return a

print(some_class().some_method(1))        

可以通过在对always_allow_keywords=True进行cythonize时提供标志来解决关键字参数的问题。