如何在Python中创建两个装饰器来执行以下操作?
@makebold
@makeitalic
def say():
return "Hello"
Run Code Online (Sandbox Code Playgroud)
...应该返回:
"<b><i>Hello</i></b>"
Run Code Online (Sandbox Code Playgroud)
我不是试图HTML在一个真实的应用程序中这样做 - 只是试图了解装饰器和装饰器链是如何工作的.
我刚开始使用Python,我不知道什么是memoization以及如何使用它.另外,我可以有一个简化的例子吗?
我正在运行一些动态编程代码(尝试暴力反驳Collatz猜想= P)并且我使用dict来存储我已经计算过的链的长度.显然,它在某些时候耗尽了内存.是否有任何简单的方法可以使用某些变体,dict当它用完房间时会将部分内容分页到磁盘上?显然它会比内存中的字典慢,并且最终可能会占用我的硬盘空间,但这可能适用于其他不那么无用的问题.
我意识到基于磁盘的字典几乎就是一个数据库,所以我使用sqlite3手动实现了一个,但是我并没有以任何智能的方式实现它并让它一次查找数据库中的每个元素...它慢了300倍.
是最聪明的方法来创建我自己的一组dicts,一次只保留一个内存,并以一种有效的方式将它们分页?
我一直在寻找一个python模块,它提供了一个具有以下功能的memoize装饰器:
我发现了几个小的代码段用于这个任务,很可能实现一个自己,但我宁愿有一个既定的软件包这一任务.我也发现了incpy,但这似乎不适用于标准的python解释器.
理想情况下,我希望functools.lru_cache在磁盘上加上缓存存储.有人能指点我这个合适的套餐吗?
我想用以下规范缓存某些函数/方法的结果:
我知道有一些基于磁盘的缓存的缓存装饰器,但是它们的到期时间通常是基于时间的,这与我的需求无关。
我考虑过使用Git commit SHA检测功能/类版本,但是问题是在同一文件中有多个功能/类。我需要一种方法来检查文件的特定功能/类段是否已更改。
我认为解决方案将包括版本管理和缓存的组合,但是我不太熟悉如何优雅地解决此问题。
例:
#file a.py
@cache_by_version
def f(a,b):
#...
@cache_by_version
def g(a,b):
#...
#file b.py
from a import *
def main():
f(1,2)
Run Code Online (Sandbox Code Playgroud)
运行main文件b.py,一旦应导致的结果的缓存f与参数1和2磁盘。main再次运行应从缓存中获取结果,而无需f(1,2)再次评估。但是,如果f更改,则缓存应无效。另一方面,如果g更改,则不应影响的缓存f。
python ×5
decorator ×2
memoization ×2
caching ×1
database ×1
dictionary ×1
disk-based ×1
git ×1
python-2.7 ×1