用于缓存函数和方法值的装饰器
项目描述
plone.memoize
plone.memoize提供Python函数装饰器,用于缓存函数和方法的值。
用户可以自由配置缓存存储的类型,以及缓存键,这是函数值所依赖的。
plone.memoize支持memcached,并且可以轻松扩展以使用其他缓存存储。它还提供了用于与Zope视图一起使用的专用装饰器。但是,plone.memoize也可以在没有Zope的情况下使用。
简介
plone.memoize提供Python函数装饰器,用于缓存函数和方法的值。
用户可以自由配置缓存存储的类型,以及缓存键,这是函数值所依赖的。
plone.memoize支持memcached,并且可以轻松扩展以使用其他缓存存储。它还提供了用于与Zope视图一起使用的专用装饰器。但是,plone.memoize也可以在没有Zope的情况下使用。
易挥发
“易挥发”模块定义了一个通用的缓存装饰器,它允许您完全控制缓存键的计算方式和存储位置。此装饰器在“volatile.py”中的示例用法中进行了更深入的说明。
“易挥发”缓存可以存储在不同的位置。一种常见的用法是zope RAMCache。在“ram”模块中提供了方便的方法来支持这一点。
使用“ram”模块通过“易挥发”缓存的一个视图的快速示例
>>> from zope.publisher.browser import BrowserView >>> from plone.memoize import ram >>> def _render_details_cachekey(method, self, brain): ... return (brain.getPath(), brain.modified) >>> class View(BrowserView): ... @ram.cache(_render_details_cachekey) ... def render_details(self, brain): ... obj = brain.getObject() ... view = obj.restrictedTraverse('@@obj-view') ... return view.render()
我们假设的“render_details”方法的输出结果被缓存跨请求,并且独立于登录用户。只有当大脑的路径或修改日期根据“_render_details_cachekey”定义发生变化时,缓存才会刷新。
这是您可以使用相同的装饰器缓存函数值一小时的示例
>>> from time import time >>> @ram.cache(lambda *args: time() // (60 * 60)) ... def fun(): ... return "Something that takes awfully long" >>> fun() 'Something that takes awfully long'
视图和实例
请参阅view.rst和instance.rst,了解具有固定缓存键和缓存存储的缓存装饰器的用法。这些视图和实例缓存装饰器最常见的用法模式是
>>> from plone.memoize import instance >>> class MyClass(object): ... @instance.memoize ... def some_expensive_function(self, arg1, arg2): ... return "Some expensive result"
当第一次调用some_expensive_function()时,返回值将被保存。在后续调用具有相同参数的函数时,将返回缓存的版本。传递不同的参数将导致再次调用函数。
请注意,这仅适用于可哈希的参数!
如果您正在编写Zope 3视图,您可以这样做
>>> from plone.memoize import view >>> class MyView(BrowserView): ... @view.memoize ... def some_expensive_function(self, arg1, arg2): ... return "Some expensive result"
这会产生相同的效果,但同一上下文中相同视图的后续查找也将被缓存。
您还可以使用@view.memoize_contextless,这样就不需要考虑上下文 - 在同一请求(但在可能的其他上下文中)查找具有相同参数的相同视图将进行缓存。
请注意,这要求请求可以使用zope.annotation进行注释!
通用
通用装饰器使用GenericCache模块作为存储。默认情况下,它将存储在其自己的全局缓存中,具有默认参数1000个最大对象和1小时最大寿命。
您可以使用new_storage方法创建自己的存储区域,并具有特定的参数。
查看文档字符串以获取一些示例。
键和参数打包
关于缓存的一个重要问题是如何生成缓存键。在上述所有装饰器中,您都可以创建自己的函数。
marshaller模块提供了一些有用的默认打包器。args_marshaller将根据函数名、模块和参数计算一个键,如果请求的话,将应用哈希。请查看文档字符串以获取用法示例。
变更日志
3.0.2 (2023-06-23)
内部
更新配置文件。[plone 开发者] (237ff4c8)
3.0.1 (2023-04-14)
内部
更新配置文件。[plone 开发者] (93e1ab65)
移除更多 Python 2 兼容代码。[maurits] (#55)
3.0.0 (2022-10-28)
破坏性更改
停止支持 Python 3.5 和 3.6。添加对 Python 3.9、3.10 和 3.11 的支持。[davisagli] (#27)
2.1.1 (2021-07-28)
错误修复
在 FIPS 启用环境中工作,使用 SHA1 代替 MD5 计算缓存键。[frapell] (#25)
2.1.0 (2020-04-20)
新功能
停止对 3.4 的支持,添加 3.7、3.8、PyPy 和 PyPy3 支持。[maurits] (#16)
如果上下文没有,则使用 zope global request 作为后备。[ale-rt] (#17)
错误修复
使代码黑色。[ale-rt] (#17)
改进从缓存获取资源时的速度。[ale-rt] (#19)
删除 bootstrap-buildout.py。如果您使用 buildout,请使用 virtualenv 并使用 pip 安装 zc.buildout 代替。将 [isort] 和 [flake8] 配置部分添加到 setup.cfg 中。对 Python 文件中的所有导入进行排序。[thet] (#21)
2.0.1 (2019-04-29)
错误修复
修复 TravisCI 中的损坏测试 (#12) [andbag] (#12)
2.0.0 (2019-02-08)
破坏性更改
重新许可为 BSD 许可证 (2009 年 9 月 13 日记录,https://plone.org/foundation/materials/foundation-resolutions/plone-framework-components-relicensing-policy) [andbag] (#12)
错误修复
此处和那里清理包。[gforcada] [mauritsvanrees] (#15)
1.2.3 (2018-09-26)
错误修复
重新启用 Travis-CI。此包可用于 Plone 之外,因此也应在外部进行测试。[howitz]
1.2.2 (2018-02-23)
错误修复
停止 travis 和 tox。在某个时间点有效解决方案不一定在以后也有效。plone.memoize 在 jenkins.plone.org 上进行测试。[gforcada]
清理依赖关系。[gforcada]
1.2.1 (2017-07-03)
新功能
在装饰器中保持 docstrings 完整。[pgrunewald]
修复
更新 Travis 设置(删除 Python2.6,容忍失败的 pypy3)[pgrunewald]
1.2.0 (2016-02-12)
新功能
停止对 Plone 4 和 Python 2.6 的官方支持。[maurits]
Python 3 兼容。[tomgross]
修复
用 stdlib 中的 doctest 模块替换过时的 zope.testing.doctest 导入。[thet]
1.1.2 (2016-01-08)
修复
重构文档。[thet]
PEP 8 的微小修改。[thet]
1.1.1 (2011-05-12)
添加 MANIFEST.in。[WouterVH]
1.1 (2010-07-18)
更新许可证为仅限 GPL 版本 2。[hannosch]
解决在测试 CleanupDict 类期间出现的间歇性错误,因为零秒的清理周期并不总是导致清理,如果测试运行得太快。[maurits]
1.1b1 (2009-11-13)
更新了包文档。[hannosch]
1.1a4 (2009-07-23)
使用新的 zope.ramcache 包而不是 zope.app.cache。这大大减少了我们的依赖项。[hannosch]
1.1a3 (2009-05-10)
稍微现代化和清理了代码。还删除了对 zope.app.annotation 的 BBB 支持,并使测试再次工作。[hannosch]
1.1a2 (2009-05-08)
删除了所有对 zope.app 包的测试依赖项。[hannosch]
将一个测试更改为使用 zope.publisher 而不是 Five BrowserView。这消除了对 Zope2 的整个依赖项。[hannosch]
纠正 Zope2 依赖关系,它确实是仅测试依赖项。[hannosch]
1.1a1 (2009-04-04)
澄清了许可证声明。[hannosch]
将测试依赖项的声明移入测试 extra。[hannosch]
避免 Python 2.6 中 md5 和 sha 模块的弃用警告。[hannosch]
指定包依赖项。[hannosch]
在计算 md5 校验和之前,在缓存键中添加对 Unicode 值的检查,因为 md5 模块似乎不喜欢 Unicode。[hannosch]
删除了 zope.app.annotation 的 BBB 代码。[hannosch]
clearbefore 装饰器被错误地未测试。[maurits]
1.0.4 (2008-03-31)
清理文档和发布说明。[hannosch]
1.0.3 (2007-11-09)
从 Plone 3.0 分支中删除功能。[nouri]
Plone 3.0 的维护分支。[nouri]
去除sys.modules黑客技巧,根据这个更改集: http://dev.plone.org/plone/changeset/15030,我建议添加,在Kapil的帮助下,PloneGetPaid项目找到了更好的方法。[maurits]
修改文档和项目描述。[nouri]
合并Gael Le Mignot的补丁。
不再使用哈希值制作缓存键。这是为了避免缓存冲突,并避免潜在的攻击者手动制造冲突的安全问题。另外,停止在测试中推荐使用hash()。
添加对使用Pilot System的GenericCache作为‘plone.memoize.volatile.cache’后端的支持。
添加一个参数marshaller,它为你提供一种更方便的方式来声明你的缓存依赖于参数。请参阅‘plone.memoize.marshallers’。
[nouri, gael]
1.0.1 (2007-09-10)
通过复用plone.memoize.volatile中的内容来简化永久性。[nouri]
1.0 (2007-08-17)
添加一个永久性缓存 - 直至Zope重启。[optilude]
在ree的64位Python中,hash((1, 2))返回不同的值。[nouri]
不要特别处理None。避免一次字典查找。[nouri]
扩展了xhtml_compress方法,使其使用IXHTMLCompressor实用工具的实用工具查找。现在,您可以通过简单的实用工具注册来开启基于slimmer的压缩。请参阅compress.py。[hannosch, fschulze]
1.0rc2 (2007-07-27)
添加了一个简单的xhtml_compress方法,可以用来连接空格删除库。Peter Bengtsson的slimmer库已配置,但默认未启用。[hannosch]
1.0b4 (2007-07-09)
在RAMCacheAdapter中使用提供的键的md5哈希值,减少内存占用并加快查找时间。[hannosch]
对volatile部分进行了一些修改,以说明为什么示例不使用volatile模块中的任何内容。[wichert]
使用异常DontCache代替DONT_CACHE标记返回值。允许不注册任何ICacheChooser。[nouri]
为请求添加缓存装饰器(实际上可用于各种可注解对象)。[nouri]
添加了将缓存值存储在请求上的注释中的装饰器。[nouri]
始终将函数的点分名称包含在键中。[nouri]
添加了一个新的缓存装饰器,该装饰器可以缓存请求上方法调用的结果,并允许您指定函数上的哪个参数是请求。[hannosch]
将MemcacheAdapter作为RAMCacheAdapter的替代方案。[nouri]
将IRAMCacheChooser泛化为ICacheChooser,它不返回IRAMCache,而是一个简单的dict。[nouri]
为新的RAMCache使用更合理的默认maxAge。[hannosch]
为使用zope.app.cache.ram.RAMCache的plone.memoize.volatile添加缓存存储。[nouri]
从memojito中合并更改以修复递归缓存的函数(由Rob Miller和Whit Morriss修复)。[whit]
使plone.memoize与zope2.9向后兼容,并在没有zope.annotation的情况下保持可用。对一些文档进行了一些小的措辞更改。[whit]
默认情况下,使用自动清理的volatile字典。[nouri]
此‘volatile’模块定义了一个通用的缓存装饰器,它允许您完全控制缓存键的计算方式和存储位置。[nouri]
1.0b3 (2007-05-05)
初始包结构和实现。[hannosch, nouri, optilude, whit, zopeskel]
项目详情
下载文件
下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。
源分发
构建分发
plone.memoize-3.0.2.tar.gz的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 2f96508cf5f9a2966c0d1b20bab4ef4221e2005c0ab82b4654bf55e941cd2008 |
|
MD5 | 6e0023abc9da6d2aeaaa0a1fe48bdaff |
|
BLAKE2b-256 | 876a62df8d57cb6dc0b9999974713a3c359e9c03b318d5f227fe6935898cf3b4 |
plone.memoize-3.0.2-py3-none-any.whl的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | e136ee35c070dba71aa0d73279dffe2c7f312eb70c70364bc8e746a2438f6460 |
|
MD5 | f2a1aa0902ff0ca4b906049ee41d431d |
|
BLAKE2b-256 | 99c9e26278cdb198fd172d22d2f4c7643dcf58e515ed6a8396eece5fdcde930a |