написание декоратора класса

#numpy #python-decorators

#numpy #python-декораторы

Вопрос:

у меня есть класс, в котором есть метод с именем my_func(x,s,n) . Мне нужно векторизовать эту функцию. То есть я хочу иметь возможность передавать x = [3,4,5,6,7] или любой диапазон значений, и это дает мне результат. Я использую numpy и просматриваю здесь, мне удалось найти решение, которое работает. Тем не менее, я хочу сделать его объектно-ориентированным. Я попробовал это:

 class Vectorize:
    """vectorization wrapper that works with instance methods"""
    def __init__(self, otypes=None, signature=None):
        self.otypes = otypes
        self.sig = signature

    # Decorator as an instance method
    def decorator(self, fn):
        vectorized = np.vectorize(fn, otypes=self.otypes, signature=self.sig)

        @wraps(fn)
        def wrapper(*args, **kwargs):
            return vectorized(*args, **kwargs)
        return wrapper
  

и затем я попробовал это:

 @Vectorize(signature=("(),(),(),()->()"))
def my_func(self, k: int, s: float, n: int):
  

Я продолжаю получать сообщение об ошибке, объект векторизации не вызывается. Есть ли какой-либо другой способ сделать это? Спасибо

Комментарии:

1. Прежде чем вкладывать слишком много времени в этот проект, обратите внимание на отказ от ответственности за производительность. Использование signature еще больше снижает производительность.

2. np.vectorize может использоваться непосредственно в качестве декоратора, хотя я не знаю, как указать значения otypes or sig . partial может помочь, но я мало работал с декораторами. Это код python (или, по крайней мере, был в прошлом), но я не знаю, где он находится в github репозитории. Но я подозреваю, что это чисто проблема кода декоратора, а не numpy конкретная.

Ответ №1:

Мне удалось исправить эту проблему. Но теперь, когда вы сказали, что подпись снижает производительность, я рассматриваю альтернативное решение. Для тех, кому интересно:

 class Vectorize:
"""vectorization decorator that works with instance methods"""
def vectorize(self, otypes=None, signature=None):
    # Decorator as an instance method
    def decorator(fn):
        vectorized = np.vectorize(fn, otypes=otypes, signature=signature)

        @wraps(fn)
        def wrapper(*args, **kwargs):
            return vectorized(*args, **kwargs)
        return wrapper
    return decorator

class CustomClass:
    v = Vectorize()
    
   @v.vectorize(signature=("(),(),(),()->()"))
   def my_func(self, k: int, s: float, n: int):