获取对象的python_冻结引用。
frozenobj的Python项目详细描述
冻结
冻结创建对对象的不可变引用这可以(懒洋洋地)递归地工作:可变成员在访问时也会被冻结。它使原始对象保持可变,返回一个代理类,该类的行为与对象一样,只是不可编辑。如果基础对象发生更改,代理将自动反映这一点。因此,它是不可变的,因为引用不能用来更改它,而不是根本不能更改它(当然,您可以放弃原始的可变引用)。冻结的对象不能用作字典键。
安装
- pip安装frozenobj
- 利润
用法
用法很简单:
from frozenobj import frozen immutable_obj = frozen(mutable_obj)
举个简单的例子:
class Cls: def __init__(self): self.li = [37, 42] original = Cls() freezered = frozen(original) original.li.append(99) # works freezered.li.append(99) # ImmutableError
查看tests.py以获取更多示例。
注释
- 有人真的决定改变你的代理对象可以找到这样做的方法。这不是一个安全措施,它只是一种强制你的界面的方式(在纯粹想象的情况下,人们不阅读或遵循手册说他们不应该改变事情)
- 它应该适用于大多数对象。它适用于类、类实例、模块、列表、集合、词典以及从中派生的某些类型。它隐式地为int、浮点、字符串和元组工作,它们总是不可变的(它们是返回的,不是代理的)。函数和方法也被认为是常数
- frozen方法是等幂的,并使用缓存:如果在同一对象上连续或并行调用两次,则获得相同的代理
- 访问时的递归冻结虽然不是完全免费的,但应该具有相当低的计算成本(您只需要存储多次访问的值)。
- 很大程度上依赖于lazy-object-proxy包,这很好。
许可证
冻结在修订的bsd许可下可用,请参阅license.txt。你可以做任何事情,只要你包括许可证,不要用我的名字来推广,并知道没有保证