1

我想为某个函数参数设置容差,但不为其他参数设置容差。假设我有这样的功能:

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.__version__ 0.1.1) 安装的 klepto。我应该更改键盘映射吗?

4

1 回答 1

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(第一个参数)被缓存了……它不会随着大于而改变tol=0。因此,当您更改param0param1......它不会使缓存无效,并且您仍然会返回已缓存的值。

因此,无论您对 以外的任何内容进行了多少更改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)

即使我使用 a **,最后两个参数仍然被忽略,因为忽略适用于函数规范而不是调用。

>>> 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
于 2015-12-15T04:08:06.060 回答