字典库,包括良好的深度合并和字典作为对象
dictlib的Python项目详细描述
dictlib是字典的轻量级附加组件,其特点是:
- dictionary union正确完成:
union()
(非永久安全),union_copy()
(永久安全) "String.dot"
表示法,用于从经典词典中检索,字符串键为:dig()
,dig_get()
,dug()
。为了提高效率,它不是一个目标。如果希望在代码中更常用点表示法,请改用Dict()
。Object.key
字典键作为对象属性(简单类):Dict()
(对于快速成型很有用, 只要把你的班级定义为一个dict,不管怎样:- 平衡特性和性能:我们可以做更多的工作(比如支持字典[“this.key”]内联点表示法),但是我想
保持它接近本机性能,并且拥有像
dig()
这样的外部函数类似于ruby的方法,因此您可以根据需要使用它, 如果你真的想要点符号,那么使用一个在运行时有效的内联方法,比如Dict()
NewClass=DictclassNewClass(Dict):pass
如果这对您不起作用,请考虑其他字典帮助程序库:
- Scalpl
- 更深入的工具,类似于
dictlib.dig()
和dictlib.dug()
- 不包括作为对象属性的键--
Dict()
- 更深入的工具,类似于
- Addict
- 类似于
addict.Dict()
和dictlib.Dict()
- 随着时间的推移,我将添加一个更好的比较
- 类似于
- Box
- 类似于
addict.Dict()
和dictlib.Dict()
- 随着时间的推移,我将添加一个更好的比较
- 类似于
union()和union\u copy()
fromdictlibimportunion,union_copydict1=union(dict1,dict2)dict3=union_copy(dict1,dict2)
dict2与dict1的深度联合,在dict1中递归合并字典值。 非字典元素被替换,首选项是dict2。
这会改变dict1,这是返回的结果,但它将引用 两本字典。如果不需要,请使用union_copy(),它是 高效但数据安全。
dig()和dig-get()
使用点表示法递归地从字典中提取。dig-get的行为类似于dict.get()
,但使用点标记键。
fromdictlibimportdig,dig_getdict1={"a":{"b":{"c":1},"d":[{"e":1},{"f":2}]}}dig(dict1,"a.b.c")# 1dig(dict1,"a.d[1].f")# 2dig(dict1,"a.b.z")# KeyError: 'z'dig_get(dict1,"a.b.z")# Nonedig_get(dict1,"a.b.z",2)# 2
dug()
与dig()
相反,dug()
使用点表示法将项放入嵌套字典。
这并不是一成不变的,因为它改变了原始字典。
fromdictlibimportdugdict1={"a":{"b":{"c":1}}}dug(dict1,"a.b.c",200)# {'a': {'b': {'c': 200}}}# and it will instantiate dictionaries as values if the key doesn't exist:dug(dict1,"a.b.z.e",True)# {'a': {'b': {'c': 200, 'z': {'e': True}}}}
注意:dug()不支持推送到字典中的列表,它假定 所有值都是点符号字符串中的字典。如果你试图使用 一个列表索引,它的行为仍然像一本字典,可能会给你 意外结果:
dict1={"a":{"b":{"c":1}}}dug(dict1,"a.b.d[0].e",True)# {'a': {'b': {'c': 1, 'd': {0: {'e': True}}}}}
(请务必正确完成此功能)
dict()
一点糖,以对象形式表示字典,其中键设置为 对象上的属性。功能:
- 如果密钥不是python安全的(
"this-key"
是.this_key
),它会标记它们。示例:
d=Dict({"this key":"value"})d["this-key"]# "value"d.this_key# "value"
- 递归——它将遍历字典的全部深度
这不是python zen,因为它提供了另一种使用词典的方法, 它对与内置方法冲突的名称有一些挑战,但是 非常
但我不介意,因为这是一点糖。
限制:
- 如果名称与保留字冲突,则引发错误
- 保留密钥前缀\f$\f供内部使用(引发错误)
- 由于名称空间冲突问题,您必须小心输入哪些键
ugly_var_
。然而,它们并不是指向同一个
数据值!当两者都存在时,如果导出到原始对象^ {EM1}仅$ EEM>
使用标记化名称的值(参见示例)fromdictlibimportDictDict(key1=1,a=2)# {'key1': 1, 'a': 2}test_dict={"a":{"b":1,"ugly var!":2},"c":3}test_obj=Dict(**test_dict)test_obj.keys()# ['a', 'c']'a'intest_obj# Truetest_obj.get('c')# 3test_obj['c']# 3test_obj.c# 3test_obj.c=4test_obj.c# 4test_obj.a.b# 1test_obj.a.ugly_var_# 2test_obj.a['ugly var!']# 2# however, these are distinctly different values, don't be confused:test_obj.a.ugly_var_=0xdeadbeeftest_obj.a.ugly_var_# 3735928559test_obj.a['ugly var!']# 2# how it looks -- in most cases it tries to look normal for you, but you can# use __export__ and __original__ to be assured. In some cases you can see the# mapping keys, which is confusing, and needs to be fixed (PR appreciated):test_obj=Dict(test_dict)test_obj# {'a': {'b': 1, 'ugly_var_': 2, 'ugly var!': 2}, 'c': 3}importjsonjson.dumps(test_obj)# '{"a": {"b": 1, "ugly_var_": 2, "\\f$\\fugly_var_": "ugly var!", "ugly var!": 2}, "c": 3}'json.dumps(test_obj.__export__())# removes key mapping values, but keeps split tokenized keys# '{"a": {"b": 1, "ugly_var_": 2, "ugly var!": 2}, "c": 3}'json.dumps(test_obj.__original__())# removes key mapping values and tokenized keys# '{"a": {"b": 1, "ugly var!": 2}, "c": 3}'test_obj.__original__()# {'a': {'b': 1, 'ugly var!': 2}, 'c': 3}
注意:Dict()
以前是Obj()
,虽然已被弃用,但仍受支持。
dictlib.original()和dictlib.export()
walkdict1
可以是dict()/dict()混合,并将任何dict()导出到dicT(),
分别使用Dict.__original__()
或Dict.__export__()
方法。
(对于数据转换非常有用,例如dict->;yaml)
importjsonexport(Dict({"ugly first":1,"second":{"tres":Dict({"nachos":2})}}))# {'ugly_first': 1, 'ugly first': 1, 'second': {'tres': {'nachos': 2}}}json.dumps(Dict({"ugly first":1,"second":{"tres":Dict({"nachos":2})}}))# '{"ugly_first": 1, "\\\\f$\\\\fugly_first": "ugly first", "ugly first": 1, "second": {"tres": {"nachos": 2}}}'json.dumps(export(Dict({"ugly first":1,"second":{"tres":Dict({"nachos":2})}})))# '{"ugly_first": 1, "ugly first": 1, "second": {"tres": {"nachos": 2}}}'