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个参数)`

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java使用二进制搜索查找两个排序数组的所有公共元素   java应用程序在POJO之间不能有重复的代码块   java为什么私有构造函数可以工作而私有Setter不能在SPRING DI IOC中工作   接收并返回两种类型之一的java函数   java在每个测试用例之后清除内存中的数据库   java如何从Android视频录制中实时捕获逐帧图像   Java数据类(多文件管理)   java如何利用selenium抓住网站的价值   java每周或每月更改日期   Azure Cosmos DB Java SDK支持Spring Boot 2.4。十、   java为什么SLF4不显示来自JUL FINER消息的调试消息?   JAVAutil。扫描仪如何在Java中使用扫描仪读取文本文件?   java Hibernate可以读取Hibernate的内容。cfg。但是仍然会给出错误?