通过简单地修改当前对象来创建下一个不可变对象

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支持:

  • dicts
  • lists
  • sets
  • tupless
  • namedtupless
  • attrss

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]}

Lenss可通过其.proxy()方法组合(这是最初提供的代理的副本)Lens(Lens(Proxy()['foo']).proxy()[1])相当于Lens(Proxy()['foo'][1])

插件:

^ }当前有一个^ {< CD10>}插件,注册插件非常简单,只需改变^ {}列表(参见现有的ADTI插件的结构的here)。

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

推荐PyPI第三方库


热门话题
java如何在sqlite数据库中保存特定列的历史记录   java如何更改/更新timeseriechart名称(JFreeChart)   java如何将整数转换为可绘制的   汇编什么解释Java的字节码   java查找已编译的类版本号   我应该什么时候在ColdFusion应用程序中使用Java?   java当一个实体的两个字段为(unique=true)时,如何处理JPA异常?   java为什么在所有其他实例都正确的情况下返回错误的布尔值?   java Hibernate每次都准备语句   java停留在平均字长上   对Java和日语字符进行编码   java如何将导致异常的方法的错误消息传递给侦听器中的onTestFailure方法   java代码没有打印结果   java为什么私有内部接口的方法必须是公共的?   休眠发生错误。有关详细信息,请参阅错误日志。JAVAlang.NullPointerException