递归地将列表转换为元组、将集合转换为frozensets、将dict转换为mappingproxy等。
freezedata的Python项目详细描述
递归地将list转换为tuple,set转换为frozenset, dict到mappingproxy等。
示例用法:
importfreezedatadata=[{'a':[1,2,3],'b':{1,2,3}},{1:1,2:2,3:3}]frozendata=freezedata.freeze_data(data)print(frozendata)>>(mappingproxy({'a':(1,2,3),'b':frozenset({1,2,3})}),mappingproxy({1:1,2:2,3:3}))
这是一个只读的数据结构,也就是说,没有直接的方法来改变它 来自frozendata本身的数据结构(不使用某些特殊模块(gc, inspect))。
例如:
frozendata[0]['a'][0]=4>>TypeError:'tuple'objectdoesnotsupportitemassignmentdelfrozendata[1][1]>>TypeError:'mappingproxy'objectdoesnotsupportitemdeletion
注意:因为mappingproxy不是可哈希的冻结数据 包含mappingproxy(即基于dict)的结构将不会 可散列:
hash(frozendata)>>TypeError:unhashabletype:'mappingproxy'
另一方面,如果冻结的数据结构只包含散列元素,则 结构也将是散列的(并且是不可变的):
frozendata=freezedata.freeze_data([[1,2,3],{4,5,6}])print(frozendata)>>((1,2,3),frozenset({4,5,6}))hash(frozendata)>>-11948691520864899
放松要求(接受函数、模块、类和实例):
函数、模块(用户创建的)类和实例在python中是可变的,因此 既不是不可变的,也不是只读的。默认情况下,使用这些将导致错误,但设置 参数allow作为functions,modules,^{tt16}的一个、多个或全部$ 和instances,它们可以在新的数据结构中使用。
函数在python中具有可变属性,但有时您仍然希望 不会影响父数据结构/父函数的新数据结构。 通过设置allow='functions'或allow=['functions'],新的数据结构将 包含包含函数及其公共属性的copy
deffunc(n):returnn*2func.a='a'data=[func]frozendata=freezedata.freeze_data(data,allow='functions')data[0]==frozendata[0]>>Falsefrozendata[0].a='b'print(data[0].a,frozendata[0].a)>>ab
modules将被转换为namedtuple,如果您正在冻结模块。 如果模块在数据结构中,但不是顶层,则默认情况下会引发错误。 如果设置了allow={'modules'},则允许非顶级模块并保持不变。
类和类实例可以转换为namedtuple,并在 通过设置allow={'classes', 'instances}或仅设置一个来冻结数据结构,例如 allow={'classes'},根据需要。通过转换为namedtuple,信息可能会丢失,如 带有前导下划线的属性将被忽略:
classTest:a=1def__init__(self,a):self.a=atest=Test(2)frozendata=freezedata.freeze_data([Test,test],allow={'classes','instances'})print(frozendata)>>(Test(a=1),Test(a=2))print(type(frozendata[0]),type(frozendata[1]))>><class'freezedata.freezedata.Test'> <class 'freezedata.freezedata.Test'> # two namedtuples