Cython не работает с двойными декораторами с аргументом.Есть ли обходной путь? - PullRequest
2 голосов
/ 10 мая 2019

У меня проблема с цитонизацией моего кода на Python.Я попытался воспроизвести самый простой случай ошибки, которую я получаю.

Вот иллюстрация кода, который я хочу процитировать:

     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,Но когда я кодирую этот код, он выдает ошибку во время выполнения:

print (some_class (). Some_method (1))

TypeError: wrapper () принимает ровно один аргумент(2 дано)

Компиляция запускается без проблем.Если я напишу @some_decorator_with_arg(arg=1), я получу еще одну ошибку:

@ some_decorator_with_arg (arg = 1)

Ошибка типа: some_decorator_with_arg () не принимает аргументов без ключевого слова

Кто-нибудь знает решение этой проблемы?

1 Ответ

2 голосов
/ 15 мая 2019

Я нашел самый простой способ решения проблемы - объединить функциональность двух (или более) декораторов в один, тогда у 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

...