Различный допуск для параметров в кэше клепто
Я хотел бы установить допуск для определенного аргумента функции, но не для других. Допустим, у меня есть такая функция:
def myFnc(input1,param0 = 0, param1 =1):
return "input1:%s [params %s, %s]" %(input1, param0, param1)
Это ожидаемые результаты:
>>>> myFnc(0.1, param0= 0.1, param1 = 1)
'input1:0.1 [params 0.1, 1]'
>>>> myFnc(0.1, param0= 0.12, param1 = 1)
'input1:0.1 [params 0.12, 1]'
>>>> myFnc(0.12, param0= 0.1, param1 = 1)
'input1:0.1 [params 0.1, 1]' #the same as the first instruction
Я пытался использовать Tol и игнорировать, но я не понимаю, что я ожидаю:
>>>> from klepto import inf_cache
>>>> f=inf_cache(tol=0,ignore=("**"))(myFnc);
>>>> f(0.1, param0= 0.1, param1 = 1)
'input1:0.1 [params 0.1, 1]'
>>>> f(0.1, param0= 0.12, param1 = 1)
'input1:0.1 [params 0.1, 1]' #I wanted [params 0.12, 1]
>>>> f(0.12, param0= 0.1, param1 = 1)
'input1:0.1 [params 0.1, 1]'
Я использую klepto, установленный из pip (klepto.__version__ 0.1.1). Должен ли я изменить схему клавиш?
1 ответ
Я klepto
автор. Это похоже на ожидаемые результаты для меня. Ваша линия f=inf_cache(tol=0,ignore="**")(myFnc)
говорит мне, что вы хотите округлить с целочисленным допуском, и что вы хотите игнорировать все дополнительные **kwds
в вашей функции.
Тем не менее, ваша функция myFcn
не использует **kwds
, поэтому я предполагаю, что вы имеете в виду, что вы хотите ignore=('param0','param1')
, Когда вы используете ignore
, он используется, чтобы "игнорировать" переменные в объявлении функции… не вызов функции.
Когда вы игнорируете переменную, кеш игнорирует переменную.
>>> f = inf_cache(tol=0, ignore=('param0','param1'))(myFnc)
>>> f(.1, param0=.1, param1=1)
(0.1, 0.1, 1)
>>> f(.1, param0=.12, param1=1)
(0.1, 0.1, 1)
>>> f(.12, param0=.1, param1=1)
(0.1, 0.1, 1)
Выше только input1(the first argument) is being cached… and it doesn't change with greater than
тол = 0. So, when you change
param0or
param1`… это не делает кэш недействительным, и вы все равно получаете возвращенное уже кэшированное значение.
Таким образом, независимо от того, насколько вы измените что-либо, кроме input1
, вы все равно получите первоначально кэшированное значение.
>>> f(.1, param0=5.1, param1=1)
(0.1, 0.1, 1)
>>> f(.1, param0=5.1, param1=10)
(0.1, 0.1, 1)
Тем не менее, когда я меняю input1
за пределами толерантности int… тогда у нас есть второй кешированный результат.
>>> f(5.1, param0=5.1, param1=10)
(5.1, 5.1, 10)
И даже если я использую **
последние два аргумента по-прежнему игнорируются, поскольку игнорирование применяется к спецификации функции, а не к ее вызову.
>>> f(5.1, **dict(param0=100, param1=100))
(5.1, 5.1, 10)
Изменение keymap
не изменит результаты вообще. Что меняет keymap
делает это изменить то, что используется в качестве ключей в кэше.
>>> f.__cache__()
null_archive({5999492624188339149: (0.1, 0.1, 1), 58251017057462798: (5.1, 5.1, 10)}, cached=True)
Вы также можете увидеть, что он использует кэшированные значения с помощью lookup
вместо того, чтобы фактически использовать кэширование.
>>> f.lookup(5.1, 6, 10)
(5.1, 5.1, 10)
>>> f.lookup(4.1, 5.1, 10)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/mmckerns/lib/python2.7/site-packages/klepto-0.1.2.dev0-py2.7.egg/klepto/_cache.py", line 341, in lookup
return cache[keymap(*_args, **_kwds)]
KeyError: -2002243791131618159