Python: декоратор определенный аргумент (не связанный с перенесенной функцией)?

Вы проверили свой фрагмент.xml, если использовали внутри него какие-либо идентификаторы? Если да, вы должны убедиться, что фрагмент уничтожен, прежде чем открывать его снова.

6
задан Parand 19 March 2009 в 01:11
поделиться

3 ответа

Идея состоит в том, что Ваш декоратор является функцией, возвращая декоратора.

ПЕРВАЯ Запись Ваш декоратор, как будто Вы знали свой аргумент, была глобальной переменной. Скажем, что-то как:

-

def decorator(f):
  def decorated(*args,**kwargs):
      cache = Cache(cachepath)
      if cache.iscached(*args,**kwargs):
          ...
      else:
          res = f(*args,**kwargs)
          cache.store((*args,**kwargs), res)
          return res
  return decorated

ЗАТЕМ Пишут функция, которая берет cachepath в качестве аргумента, и возвратите своего декоратора.

-

def cache(filepath)
    def decorator(f):
      def decorated(*args,**kwargs):
          cache = Cache(cachepath)
          if cache.iscached(*args,**kwargs):
              ...
          else:
              res = f(*args,**kwargs)
              cache.store((*args,**kwargs), res)
              return res
      return decorated
    return decorator
9
ответ дан 8 December 2019 в 13:49
поделиться

Ответ Paul хорош, я переместил бы объект кэша, таким образом, он не должен быть создан каждый раз, и разработайте свой кэш так, чтобы он повысил KeyError, когда существует неудачное обращение в кэш:

def cache(filepath):
    def decorator(f):
        f._cache = Cache(cachepath)
        def decorated(*args,**kwargs):
            try:
                key = (args, kwargs)
                res = f._cache.get(key)
            except KeyError:
                res = f(*args, **kwargs)
                f._cache.put(key, res)
            return res
        return decorated
    return decorator
3
ответ дан 8 December 2019 в 13:49
поделиться

Да это. Как Вы знаете, декоратор является функцией. При записи в форме:

def mydecorator(func):
   def wrapper(*args, **kwargs):
       return func(*args, **kwargs)
   return wrapper

@mydecorator
def foo(a, b, c):
    pass

аргумент передал mydecorator функция foo самостоятельно.

Когда декоратор принимает аргумент, вызов @mydecorator('/path/to') на самом деле собирается вызвать mydecorator функцию с '/path/to' сначала. Затем результат вызова к mydecorator(path) будет назван для получения функции foo. Вы эффективно определяете динамическую функцию обертки.

Короче говоря Вам нужен другой слой функций декоратора.

Вот этот немного глупый пример:

def addint(val):
    def decorator(func):
        def wrapped(*args, **kwargs):
            result = func(*args, **kwargs)
            return result + val
        return wrapped # returns the decorated function "add_together"
     return decorator # returns the definition of the decorator "addint"
                      # specifically built to return an extra 5 to the sum

@addint(5)
def add_together(a, b):
    return a + b

print add_together(1, 2)
# prints 8, not 3
5
ответ дан 8 December 2019 в 13:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: