decorator以命令语法创建和更新不可变值。
pyrsistent-mutable的Python项目详细描述
概述
pyresistent mutable包提供了一个decorator,该decorator将一个修饰函数转换为使用 pyrsistentapi。
这意味着将转换一组特定操作:
- 文本sets、dicts和lists的构造转换为对pset、^{tt5}的调用$ 和pmap。
- 重新编写作业以处理:
- 对属性的赋值变成演化调用;嵌套被正确处理。
- 扩充的赋值被转换成常规赋值。
- 独立方法调用转换为赋值。
frompyrsistent_mutableimportpyrmutefrompyrsistentimportPRecord,fieldclassSimple(PRecord):attr=field()other=field()@pyrmutedefexample_func():# Built in referential integritysave_vector=my_vector=[0,1,2,3,4]# Mapped to a pvectordelmy_vector[3]# Does *not* change save_vector# Evolve nested attributesmy_precord=Simple(attr=Simple(),other=[])my_precord.attr.attr=5my_precord.other.append(20)# Transforms literals and comprehensionsmy_maps=[{'filling':key}forkeyin('apple','banana')]my_maps[0]['crust']='flaky'returnmy_vector,save_vector,my_precord,my_maps
此示例在tests/test_readme.py中进行测试。
有什么意义?
这完全是因为命令式表单更容易阅读,而Pyristent的API对于嵌套的集合来说是乏味的, 至少与本机python语法相比。
另外,我正在研究一种更广泛地使用这种技术的语言,所以这是一个将 原型变成更普遍有用的东西。
安装
安装应该是:
# Install via pip, preferred. pip3 install pyrsistent-mutable # Install traditionally. python3 setup.py install
使用量
除上述示例外,使用此模块时需要记住的主要事项:
- 函数仍然需要返回值。
- 一份“拷贝”可以通过简单的分配来完成。
- 列表、听写和集合文字和理解被转换。
- 元组是not转换的,生成器也是。
- 如果方法调用是独立表达式,则只对它们进行转换。
- 重写的操作对于非<pyresistent值应该回到正常行为。
- 修饰函数不能允许nonlocal名称。
- global可能无法工作。
故障排除
这真的只是尝试一个原型,并做一些有用的东西。
如果一个函数没有以一种有用的方式调用某个函数,那么罪魁祸首可能是我在 pyrsistent_mutable.globals。
别忘了return
这只会咀嚼赋值和表达式语句。
阅读__source__
转换后的代码被写入__source__下的函数中,这可能有助于调试。
已知限值
其中大多数是因为我只做了非常初步的工作,将命令操作映射到持久值。
- 片的分配使用evolver框架,它不处理复杂的片。
- 同样地,删除切片也不起作用。
- 增广赋值通常要求RHS上有一个Pyristent值。
- 现在模块翻译了文本,这就减轻了。
- 它不在异步函数或生成器上测试。不过,它不应该关心他们。
- 要么全是,要么什么都不是。
- 顶级函数不能有nonlocal名称。不过,嵌入式函数可以。
调试
默认情况下,decorator将把转换后的源代码作为__source__写入函数。我刚取了那个名字 把帽子拿出来。您可以用write_source=False调用decorator来禁用此功能。
软件包维护人员注意事项
pip install twine python setup.py bdist_wheel twine upload dist/pyrsistent_mutable-0.0.x-py3-none-any.whl