Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python klepto缓存中参数的不同容差_Python_Memoization_Klepto - Fatal编程技术网

Python klepto缓存中参数的不同容差

Python klepto缓存中参数的不同容差,python,memoization,klepto,Python,Memoization,Klepto,我想为某个函数参数设置容差,但不为其他参数设置容差。 假设我有这样一个函数: 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]' >>>&

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

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和ignore,但我没有得到我所期望的:

>>>> 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.\uuuuu0.1.1版)。我是否应该更改钥匙图?

我是
klepot
的作者。对我来说,这些看起来像是预期的结果。您的行
f=inf\u cache(tol=0,ignore=“**”(myFnc)
告诉我您希望在整数公差处舍入,并且您希望忽略函数中的所有附加
**kwd

但是,您的函数
myFcn
没有使用
**kwds
,因此我假设您的意思是希望
忽略=('param0','param1')
。使用
ignore
时,它用于“忽略”函数声明中的变量,而不是函数调用

>>> f(5.1, **dict(param0=100, param1=100))
(5.1, 5.1, 10)
忽略变量时,忽略变量的是缓存

>>> 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
而改变。因此,当您更改
param0
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
>f.lookup(5.1,6,10)
(5.1, 5.1, 10)
>>>f.查阅(4.1、5.1、10)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/Users/mmckerns/lib/python2.7/site packages/klepot-0.1.2.dev0-py2.7.egg/klepot/_cache.py”,第341行,在查找中
返回缓存[keymap(*\u args,**\u kwds)]
键错误:-2002243791131618159

我是
klepot
的作者。对我来说,这些看起来像是预期的结果。您的行
f=inf\u cache(tol=0,ignore=“**”(myFnc)
告诉我您希望在整数公差处舍入,并且您希望忽略函数中的所有附加
**kwd

但是,您的函数
myFcn
没有使用
**kwds
,因此我假设您的意思是希望
忽略=('param0','param1')
。使用
ignore
时,它用于“忽略”函数声明中的变量,而不是函数调用

>>> f(5.1, **dict(param0=100, param1=100))
(5.1, 5.1, 10)
忽略变量时,忽略变量的是缓存

>>> 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
而改变。因此,当您更改
param0
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
>f.lookup(5.1,6,10)
(5.1, 5.1, 10)
>>>f.查阅(4.1、5.1、10)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/Users/mmckerns/lib/python2.7/site packages/klepot-0.1.2.dev0-py2.7.egg/klepot/_cache.py”,第341行,在查找中
返回缓存[keymap(*\u args,**\u kwds)]
键错误:-2002243791131618159

感谢您对忽略机制的更清晰解释!但是,撇开对ignore关键字的误解不谈,在示例中是否有一种内置的方法来获取我的“预期结果”,或者我是否应该使用一个函数来处理第一个输入(如果需要,应用舍入),然后使用myFnc?我明白了,所以您希望应用舍入,即“ignore”用于标记不希望对其应用舍入的参数/关键字。对吗?
klepot
中的语法是
ignore
忽略缓存中的参数/关键字(而不是取整)。我想我已经在我的另一个软件包(
mystic
,我相信)中编写了这样一个函数,但是您可能想尝试编写自己的。好的,谢谢!我想我会使用一个助手函数来检查输入。谢谢你对忽略机制的更清晰解释!但是,撇开对ignore关键字的误解不谈,在示例中是否有一种内置的方法来获取我的“预期结果”,或者我是否应该使用一个函数来处理第一个输入(如果需要,应用舍入),然后使用myFnc?我明白了,所以您希望应用舍入,即“ignore”用于标记不希望对其应用舍入的参数/关键字。对吗?
klepot
中的语法是
ignore
忽略缓存中的参数/关键字(而不是取整)。我想我已经在我的另一个软件包(
mystic
,我相信)中编写了这样一个函数,但是您可能想尝试编写自己的。好的,谢谢!我想我会使用一个helper函数来检查输入。