python和zope的缓存描述符
gocept.cache的Python项目详细描述
…内容:
==
gocept.cache
==
>方法cache
==
memoize with timeout
----
>memoize with timeout缓存具有特定超时的方法:
>; >;导入gocept.cache.method
>;
>;>gt;类点(对象):
…
…定义初始化(self,x,y):
…self.x,self.y=x,y
…
…@gocept.cache.method.memoize(0.1)
…定义距离(自,x,y):
…print('计算距离')
…返回math.sqrt((self.x-x)**2+(self.y-y)**2)
…
…@gocept.cache.method.memoize(0.1,ignore_self=true)
…定义添加一个(self,i):
…如果不是(i,int):
…print("我想要一个int")
…其他:
…打印('添加一个')
…返回i+1
…
>;点=点(1.0,2.0)
>;点距离(2,2)
1.0
现在,让我们等待0.1秒,即我们设置为缓存超时的值。之后,再次计算
距离:
>;>import time
>;>time.sleep(0.5)
>;>point.distance(2,2)
computing distance
1.0
p2=点(1.0,2.0)
>;>p2.距离(2,2)
计算距离
1.0
我们这样做是为了"添加一个"
方法:
>;>point。添加一个(3)
adding one
4
p2.添加1(3)
4
如果我们将一个不可散列的参数放入一个记忆体函数中,它将不会被缓存:
>;>point.添加1({'a':1})
i want an int
>;>点。添加一个({'a':1})
我想要一个int
元组(getfullargspec(point.distance))[:4]
(['self','x','y',none,none,none,none)
您需要处理
错误(即通过返回emtpy结果)。但通常情况下,您不希望缓存此特殊返回值。
这是我们的数据库。
>;>;类数据库(对象):
…
…呼叫计数=0
…
…def get_country(self,zip):
…self.call_count+=1
…如果self.call_count%2==0:
…raise valueerror('一些奇怪的响应')
…返回"somecountry"
…
它将在每次第二次调用时引发异常:
>;>db=db()
>;>db。获取"country(12345)"
"somecountry"
>;>db.get懔country(12345)
回溯(最近一次呼叫):
…
值错误:一些奇怪的响应
>;>db.get懔country(12345)
"somecountry"
>;>db.get廑u country(12345)
回溯(最近一次调用):
…
valueerror:一些奇怪的响应
现在我们使用do廑not廑u cache廑和廑return指定如果出现错误,我们不想缓存。
>;import gocept.cache.method
>;
>;>;gt;类别国家(对象):
…
…db=db()
…
…@gocept.cache.method.memoize(1000)
…def by_zip(self,zip):
…尝试:
…返回self.db.get_country(zip)
…除了值错误:
…返回gocept.cache.method.do_not_cache_并返回(
…)数据库已关闭。")
…
>;>;country=country()
first call将被缓存,因此我们每次调用都会得到正确的国家:
>;>;country.by撸zip(12345)
"somecountry"
>;>;country.by撸zip(12345)
"somecountry"
>;>;country.by_zip(12345)
"somecountry"
通过使用新的zip,get_country方法将第二次调用,并且会有一个未缓存的异常:
>;>country.by_zip(54321)
"db已关闭。"
因为特殊返回值没有缓存:
>;>>country.by捘zip(54321)
"somecountry"
>现在我们总是得到缓存值:
>;country.by_-zip(54321)
"somecountry"
如果要对gocept.cache.method.memoize使用的缓存进行更多控制,请在属性上存储备忘录gocept.cache.property.cachedatamanager
若要使其在事务边界上失效,可以使用@memoize\u on\u属性
装饰器从实例中检索缓存字典:
>;>;类栏(对象):
…缓存={}
…
…@gocept.cache.method.memoize_on_属性('cache',10)
…def echo(self,x):
…打印('miss')
…return x
>;>;bar=bar()
>;>;bar.echo(5)
miss
5
>;>;bar.echo(5)
5
>;>;bar.cache.clear()
>;>;bar.echo(5)
miss
5
因为它必须
能够从函数的第一个参数
(对于方法是"self")中检索缓存字典:
>;@gocept.cache.method.memoize\u on\u attribute('cache',10)
…def bar():
…print('foo')
>;>;bar()
回溯(最后一次调用):
类型错误:gocept.cache.method.memoize_on_属性无法检索函数的缓存属性"cache"<;function bar at x…>;
>;@gocept.cache.method.memoize_on_属性("cache",10)
定义baz(x):
…print('foo')
>;>baz(5)
回溯(最后一次调用):
类型错误:gocept.cache.method.memoize_on_attribute无法检索函数<;function baz的缓存属性'cache',位于x…>;
缓存的属性
==缓存在事务边界上无效。
cache=gocept.cache.property.transactionboundcache(''u v_cache',dict)
…
(注意:可能需要为缓存使用"volatile"属性名
存储,否则缓存的只读访问将触发写入。)
>;foo=foo()
>;foo.cache
{}
>;>;foo.cache['a]=1
>;>;foo.cache
{'a':1}
>如果我们提交事务,则缓存再次为空:
>;>;导入事务
>;>;transaction.commit()
>;>;foo.cache
{}
中止时也会发生同样的情况:
>;>;foo.cache['a']=1
>;>;foo.cache
{'a':1}
>;>;transaction.abort()
>;>;foo.cache
{}
==
==
更改
==
>3.1(2018-11-20)
==
==
-添加对python 3的支持.7.
-删除有关检查的弃用警告。
>3.0(2017-11-20)
==
-删除setup.py中使用的````文件`,为了适应最新的设置工具。
-添加对python 3.6的支持。
-删除对python 3.3的支持。
2.1(2016-11-17)
===br/>
-错误修复:```.property.cachedatamanager``不再使
``tpc\u vote()``和``commit()`中的缓存失效,但在`` tpc_finish()`.
-如果在
``.property.transactionboundcache```.
>2.0(2016-03-18)
==
-放弃对python 2.6的支持。
-声明对pypypyy和pypypy3的支持。
<1.0(2015-09-25)
====
=-现在测试当前最新版本的依赖项。
-放弃对python 3.2的支持。
-声明对python 3.4和3.5的支持。
0.6.1(2013-09-13)
===兼容性
0.6(2013-09-13)
==
==
-更改未重新记录,抱歉。
<0.6b2(2013-09-05)
==
-更改未重新记录,对不起。
>0.6b1(2013-09-05)
======
========br/>=====
===
==
=
=
===============
>增加了"gocept.cache.metmetmetmethod.不要在备忘录中缓存和返回(值)``不要在备忘录中缓存,不要在备忘录中返回(值)`/>返回给定值的方法/函数,无需缓存。
0.5.1(2012-03-10)
至ZTK 1.1
>0.5(2011-03-15)
==
==
-用对事务的依赖性替换对zodb的依赖性。
>0.4(2009-06-18)
==
-用zope.testing.cleanup注册清除缓存。
<0.3(2008-12-19)添加了@memoize-on-u属性以从
实例中检索memoization缓存,而不是使用gocept.cache.method的内置缓存。
0.2.2(2007-12-17)
==br/>
-修复了"transactionboundcache"中的错误,其中事务中止时缓存未失效
。
0.2.1(2007-10-17)
===
-修复了"transactionboundcache"中导致日志错误的错误:
`typeerror:<;lambda>;()只接受1个参数(给定2个参数)`
==
gocept.cache
==
>方法cache
==
memoize with timeout
----
>memoize with timeout缓存具有特定超时的方法:
>;
>;
>;>gt;类点(对象):
…
…定义初始化(self,x,y):
…self.x,self.y=x,y
…
…@gocept.cache.method.memoize(0.1)
…定义距离(自,x,y):
…print('计算距离')
…返回math.sqrt((self.x-x)**2+(self.y-y)**2)
…
…@gocept.cache.method.memoize(0.1,ignore_self=true)
…定义添加一个(self,i):
…如果不是(i,int):
…print("我想要一个int")
…其他:
…打印('添加一个')
…返回i+1
…
>;点=点(1.0,2.0)
>;点距离(2,2)
1.0
现在,让我们等待0.1秒,即我们设置为缓存超时的值。之后,再次计算
距离:
>;>import time
>;>time.sleep(0.5)
>;>point.distance(2,2)
computing distance
1.0
p2=点(1.0,2.0)
>;>p2.距离(2,2)
计算距离
1.0
我们这样做是为了"添加一个"
方法:
>;>point。添加一个(3)
adding one
4
p2.添加1(3)
4
如果我们将一个不可散列的参数放入一个记忆体函数中,它将不会被缓存:
>;>point.添加1({'a':1})
i want an int
>;>点。添加一个({'a':1})
我想要一个int
元组(getfullargspec(point.distance))[:4]
(['self','x','y',none,none,none,none)
您需要处理
错误(即通过返回emtpy结果)。但通常情况下,您不希望缓存此特殊返回值。
这是我们的数据库。
>;>;类数据库(对象):
…
…呼叫计数=0
…
…def get_country(self,zip):
…self.call_count+=1
…如果self.call_count%2==0:
…raise valueerror('一些奇怪的响应')
…返回"somecountry"
…
它将在每次第二次调用时引发异常:
>;>db=db()
>;>db。获取"country(12345)"
"somecountry"
>;>db.get懔country(12345)
回溯(最近一次呼叫):
…
值错误:一些奇怪的响应
>;>db.get懔country(12345)
"somecountry"
>;>db.get廑u country(12345)
回溯(最近一次调用):
…
valueerror:一些奇怪的响应
现在我们使用do廑not廑u cache廑和廑return指定如果出现错误,我们不想缓存。
>;import gocept.cache.method
>;
>;>;gt;类别国家(对象):
…
…db=db()
…
…@gocept.cache.method.memoize(1000)
…def by_zip(self,zip):
…尝试:
…返回self.db.get_country(zip)
…除了值错误:
…返回gocept.cache.method.do_not_cache_并返回(
…)数据库已关闭。")
…
>;>;country=country()
first call将被缓存,因此我们每次调用都会得到正确的国家:
>;>;country.by撸zip(12345)
"somecountry"
>;>;country.by撸zip(12345)
"somecountry"
>;>;country.by_zip(12345)
"somecountry"
通过使用新的zip,get_country方法将第二次调用,并且会有一个未缓存的异常:
>;>country.by_zip(54321)
"db已关闭。"
因为特殊返回值没有缓存:
>;>>country.by捘zip(54321)
"somecountry"
>现在我们总是得到缓存值:
>;country.by_-zip(54321)
"somecountry"
如果要对gocept.cache.method.memoize使用的缓存进行更多控制,请在属性上存储备忘录gocept.cache.property.cachedatamanager
若要使其在事务边界上失效,可以使用@memoize\u on\u属性
装饰器从实例中检索缓存字典:
>;>;类栏(对象):
…缓存={}
…
…@gocept.cache.method.memoize_on_属性('cache',10)
…def echo(self,x):
…打印('miss')
…return x
>;>;bar=bar()
>;>;bar.echo(5)
miss
5
>;>;bar.echo(5)
5
>;>;bar.cache.clear()
>;>;bar.echo(5)
miss
5
因为它必须
能够从函数的第一个参数
(对于方法是"self")中检索缓存字典:
>;@gocept.cache.method.memoize\u on\u attribute('cache',10)
…def bar():
…print('foo')
>;>;bar()
回溯(最后一次调用):
类型错误:gocept.cache.method.memoize_on_属性无法检索函数的缓存属性"cache"<;function bar at x…>;
>;@gocept.cache.method.memoize_on_属性("cache",10)
定义baz(x):
…print('foo')
>;>baz(5)
回溯(最后一次调用):
类型错误:gocept.cache.method.memoize_on_attribute无法检索函数<;function baz的缓存属性'cache',位于x…>;
缓存的属性
==缓存在事务边界上无效。
cache=gocept.cache.property.transactionboundcache(''u v_cache',dict)
…
(注意:可能需要为缓存使用"volatile"属性名
存储,否则缓存的只读访问将触发写入。)
>;foo=foo()
>;foo.cache
{}
>;>;foo.cache['a]=1
>;>;foo.cache
{'a':1}
>如果我们提交事务,则缓存再次为空:
>;>;导入事务
>;>;transaction.commit()
>;>;foo.cache
{}
中止时也会发生同样的情况:
>;>;foo.cache['a']=1
>;>;foo.cache
{'a':1}
>;>;transaction.abort()
>;>;foo.cache
{}
==
==
更改
==
>3.1(2018-11-20)
==
==
-添加对python 3的支持.7.
-删除有关检查的弃用警告。
>3.0(2017-11-20)
==
-删除setup.py中使用的````文件`,为了适应最新的设置工具。
-添加对python 3.6的支持。
-删除对python 3.3的支持。
2.1(2016-11-17)
===br/>
-错误修复:```.property.cachedatamanager``不再使
``tpc\u vote()``和``commit()`中的缓存失效,但在`` tpc_finish()`.
-如果在
``.property.transactionboundcache```.
>2.0(2016-03-18)
==
-放弃对python 2.6的支持。
-声明对pypypyy和pypypy3的支持。
<1.0(2015-09-25)
====
=-现在测试当前最新版本的依赖项。
-放弃对python 3.2的支持。
-声明对python 3.4和3.5的支持。
0.6.1(2013-09-13)
===兼容性
0.6(2013-09-13)
==
==
-更改未重新记录,抱歉。
<0.6b2(2013-09-05)
==
-更改未重新记录,对不起。
>0.6b1(2013-09-05)
======
========br/>=====
===
==
=
=
===============
>增加了"gocept.cache.metmetmetmethod.不要在备忘录中缓存和返回(值)``不要在备忘录中缓存,不要在备忘录中返回(值)`/>返回给定值的方法/函数,无需缓存。
0.5.1(2012-03-10)
至ZTK 1.1
>0.5(2011-03-15)
==
==
-用对事务的依赖性替换对zodb的依赖性。
>0.4(2009-06-18)
==
-用zope.testing.cleanup注册清除缓存。
<0.3(2008-12-19)添加了@memoize-on-u属性以从
实例中检索memoization缓存,而不是使用gocept.cache.method的内置缓存。
0.2.2(2007-12-17)
==br/>
-修复了"transactionboundcache"中的错误,其中事务中止时缓存未失效
。
0.2.1(2007-10-17)
===
-修复了"transactionboundcache"中导致日志错误的错误:
`typeerror:<;lambda>;()只接受1个参数(给定2个参数)`