Существует ли декоратор для простого кэширования возвращаемых значений функции?

Следующая команда:

openssl req -x509 -newkey rsa:4096 -sha256 -nodes -keyout example.key -out example.crt -subj "/CN=example.com" -days 3650

создает сертификат для домена example.com, который

  • относительно силен (по состоянию на 2018 год) и
  • , действительный для 3650 дней (~ 10 лет).

Он создает следующие файлы:

  • Закрытый ключ: example.key
  • Сертификат: example.crt

Поскольку вся информация предоставляется в командной строке, нет раздражающего интерактивного ввода. Кроме того, все эти шаги выполняются одним единственным вызовом OpenSSL: от создания секретного ключа до самозаверяющего сертификата.

Поскольку сертификат самоподписан и должен быть принят пользователями вручную,

В будущем вам может понадобиться больше, чем 4096 бит для ключа RSA и алгоритм хеширования, более сильный, чем sha256, но с 2018 года это нормальные значения.

Примечание: Теоретически вы можете оставить параметр -nodes (что означает «отсутствие шифрования DES»), в какой случай example.key будет зашифрован паролем. Тем не менее, это почти никогда не бывает полезно для установки сервера, потому что вам нужно будет либо хранить пароль на сервере, либо вам придется вводить его вручную при каждой перезагрузке.

130
задан Tobias 2 May 2009 в 16:15
поделиться

3 ответа

Звучит так, как будто вы не запрашиваете универсальный декоратор заметок (т. Е. Вас не интересует общий случай, когда вы хотите кешировать возвращаемые значения для разных значений аргументов). То есть, вы хотели бы иметь это:

x = obj.name  # expensive
y = obj.name  # cheap

, в то время как декоратор напоминания общего назначения даст вам следующее:

x = obj.name()  # expensive
y = obj.name()  # cheap

Я утверждаю, что синтаксис вызова метода - лучший стиль, потому что он предполагает возможность дорогостоящих вычислений, в то время как синтаксис свойства предполагает быстрый поиск.

[Обновление: декоратор памятки на основе классов, на который я ссылался и который цитировал здесь ранее, не работает для методов. Я заменил его функцией декоратора.] Если вы хотите использовать универсальный декоратор напоминания, вот простой:

def memoize(function):
  memo = {}
  def wrapper(*args):
    if args in memo:
      return memo[args]
    else:
      rv = function(*args)
      memo[args] = rv
      return rv
  return wrapper

Пример использования:

@memoize
def fibonacci(n):
  if n < 2: return n
  return fibonacci(n - 1) + fibonacci(n - 2)

Другой декоратор памятки с ограничением размера кеша может можно найти здесь .

27
ответ дан 24 November 2019 в 00:01
поделиться

Ах, просто нужно было найти правильное имя для этого: « Ленивая оценка свойства ».

Я тоже так много делаю; возможно я когда-нибудь воспользуюсь этим рецептом в своем коде.

5
ответ дан 24 November 2019 в 00:01
поделиться

Есть еще один пример Memoize декоратор на Python Wiki:

http://wiki.python.org/moin/pythondecoratorlibrary_meamoize

Этот пример немного умна, Поскольку оно не будет кэшировать результаты, если параметры смеются. (Проверьте этот код, это очень просто и интересно!)

3
ответ дан 24 November 2019 в 00:01
поделиться
Другие вопросы по тегам:

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