通过简单地修改当前对象来创建下一个不可变对象
immerframe的Python项目详细描述
立即帧
只需修改当前对象即可创建下一个不可变对象
这是immer的python端口。
pip install immerframe
想在不改变python数据结构的情况下对其进行深度更新吗?没问题:
fromimmerframeimportProxy,produceAnt=namedtuple('Ant','age')nested={'foo':[Ant(age=2),'bar',],}proxy=Proxy()proxy['foo'][0].age+=1proxy['foo'].pop()proxy['qux']=99new_nested=produce(proxy,nested)
new_nested
现在等于
{'foo':[Ant(age=3),],'qux':99,}
而nested
将保持不变。
“我打字怎么样?”
fromtypingimportcastCat=namedtuple('Cat','name')proxy=cast(Cat,Proxy())# continue as before but with autocomplete and type checking!proxy.name='Felix'
immerframe
使用结构共享,因此在大多数情况下应该是有效的:
d={'foo':1}l=[d]proxy=Proxy()proxy.append(100)new_l=produce(proxy,l)assertnew_l==[d,100]assertnew_l[0]isd
immerframe
支持:
dict
slist
sset
stuples
snamedtuples
sattrs
s
Lens
immerframe
附带了一个Lens
类来帮助路径重用,它有.get
、.set
、.modify
:
d={'foo':[1,2,3,4]}lens=Lens(Proxy()['foo'][1])new_d=lens.set(d,100)assertnew_d=={'foo':[1,100,3,4]}assertd=={'foo':[1,2,3,4]}assertlens.get(d)==2another_d=lens.modify(d,lambdan:n+1000)assertanother_d=={'foo':[1,1002,3,4]}
Lens
s可通过其.proxy()
方法组合(这是最初提供的代理的副本)Lens(Lens(Proxy()['foo']).proxy()[1])
相当于Lens(Proxy()['foo'][1])
。
插件:
^