Различный допуск для параметров в кэше клепто

Я хотел бы установить допуск для определенного аргумента функции, но не для других. Допустим, у меня есть такая функция:

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 changeparam0orparam1`… это не делает кэш недействительным, и вы все равно получаете возвращенное уже кэшированное значение.

Таким образом, независимо от того, насколько вы измените что-либо, кроме 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
Другие вопросы по тегам