我无法对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()不带关键字参数
有人知道解决此问题的方法吗?
答案 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时提供标志来解决关键字参数的问题。