Python: стратегии для постоянного запоминания функций с помощью аргументов функций? - PullRequest
5 голосов
/ 20 февраля 2012

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

Это все чистые функции; все данные неизменны. Однако некоторые функции принимают функции в качестве аргументов.

Создание ключей на основе этих аргументов - небольшая проблема, поскольку в Python равенство объектов функции эквивалентно идентичности объекта функции, которая не сохраняется между сессиями, даже если реализация функции не меняется.

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

Есть ли у кого-нибудь стратегии для постоянного запоминания функций с аргументами функций в Python?

Ответы [ 2 ]

3 голосов
/ 20 февраля 2012

Один из вариантов - использовать marshal.dumps(function.func_code)

. Он создаст строковое представление для кода функции.Это должно обрабатывать изменения реализации и анонимные функции.

2 голосов
/ 20 февраля 2012

Взгляните на использование этого в качестве идентификатора функции

[getattr(func.__code__,s) 
 for s in ['co_argcount', 'co_cellvars', 'co_code', 'co_consts', 
           'co_filename', 'co_firstlineno', 'co_flags', 'co_freevars',
           'co_lnotab', 'co_name', 'co_names', 'co_nlocals', 'co_stacksize',
           'co_varnames']
]

, который должен корректно обрабатывать изменение реализации любым способом ...

...