我想为某个函数参数设置容差,但不为其他参数设置容差。 假设我有这样的函数:
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]'
我正在使用从pip安装的klepto(klepto .__ version__ 0.1.1)。我可以更改密钥图吗?
答案 0 :(得分:0)
我是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
tol = 0 . So, when you change
param0 or
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)
但是,当我在int容差之外更改input1
时,我们会有第二个缓存结果。
>>> 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