字典库,包括良好的深度合并和字典作为对象
项目描述
Dictlib 是一个轻量级的词典插件,具有:
- 正确完成字典联合
union()
:(不是一成不变的安全),union_copy()
(一成不变的安全) "String.dot"
从经典字典中检索的符号,带有字符串键:dig()
,dig_get()
,dug()
. 为了效率,它不是一个对象。如果您希望代码中更常用的点表示法,请Dict()
改用。Object.key
字典键作为对象属性(简单类):(Dict()
对于快速原型设计很有用,只需将您的类定义为 Dict,无论哪种方式:- 平衡特性和性能:我们可以做更多的事情(比如支持字典['this.key'] 内联点符号),但我想让它接近原生性能,并且有一个
dig()
类似于 Ruby 的方法的外部函数,所以你可以根据需要使用它,如果您真的想要点表示法,请使用在运行时高效的内联方法,例如Dict()
NewClass = Dict
class NewClass(Dict):
pass
如果这对您不起作用,请考虑其他字典助手库:
- 头皮
- 一个更深入的工具,类似于
dictlib.dig()
和dictlib.dug()
- 不包括键作为对象属性——
Dict()
- 一个更深入的工具,类似于
- 瘾君子
- 类似于
addict.Dict()
和dictlib.Dict()
- 如果时间允许,我会添加一个更好的比较
- 类似于
- 盒子
- 类似于
addict.Dict()
和dictlib.Dict()
- 如果时间允许,我会添加一个更好的比较
- 类似于
union() 和 union_copy()
from dictlib import union, union_copy
dict1 = union(dict1, dict2)
dict3 = union_copy(dict1, dict2)
dict2 到 dict1 的深度联合,其中字典值被递归合并。替换非字典元素,优先考虑 dict2。
这会改变 dict1,它是返回的结果,但它会引用两个字典。如果您不想这样做,请使用 union_copy(),它的效率较低但数据安全。
dig() 和 dig_get()
使用点符号递归地从字典中提取。dig_get 的行为类似于dict.get()
,但使用点表示的键。
from dictlib import dig, dig_get
dict1 = {"a":{"b":{"c":1},"d":[{"e":1},{"f":2}]}}
dig(dict1, "a.b.c")
# 1
dig(dict1, "a.d[1].f")
# 2
dig(dict1, "a.b.z")
# KeyError: 'z'
dig_get(dict1, "a.b.z")
# None
dig_get(dict1, "a.b.z", 2)
# 2
挖()
的逆dig()
,dug()
使用点符号将项目放入嵌套字典中。这并不是一成不变的,因为它会改变源字典。
from dictlib import dug
dict1 = {"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}}}}}
(感谢 PR 正确完成此功能)
字典()
用一点糖来表示对象形式的字典,其中键被设置为对象的属性。特征:
- 如果它们不是 python 安全的(
"this-key"
is.this_key
),它将标记您的密钥。例子:
d = Dict({"this key": "value"})
d["this-key"]
# "value"
d.this_key
# "value"
- 递归——它将遍历字典的全部深度
这不是 python zen,因为它提供了一种使用字典的替代方式,并且它在名称与内置方法冲突方面存在一些挑战,但它非常
但我对此没意见,因为它是方便的糖。
限制:
- 如果与保留字有名称冲突,则会引发错误
- 保留键前缀 \f$\f 供内部使用(引发错误)
- 由于命名空间冲突问题,您必须谨慎输入什么键
- 每个未标记的名称存在两个键,例如
ugly var!
,它被标记为ugly_var_
。但是,它们并不指向相同的数据值!虽然两者都存在,但如果导出到原始对象,则仅使用标记化名称的值(参见示例)
from dictlib import Dict
Dict(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' in test_obj
# True
test_obj.get('c')
# 3
test_obj['c']
# 3
test_obj.c
# 3
test_obj.c = 4
test_obj.c
# 4
test_obj.a.b
# 1
test_obj.a.ugly_var_
# 2
test_obj.a['ugly var!']
# 2
# however, these are distinctly different values, don't be confused:
test_obj.a.ugly_var_ = 0xdeadbeef
test_obj.a.ugly_var_
# 3735928559
test_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}
import json
json.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()
was previous Obj()
,已被弃用但仍受支持。
dictlib.original() 和 dictlib.export()
Walkdict1
可以混合使用 dict()/Dict() 并分别使用Dict.__original__()
or方法将任何 Dict() 导出到 dict()。Dict.__export__()
(对于数据转换很有用,比如用 dict->yaml)
import json
export(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}}}'
项目详情
下载文件
下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。
源分布
dictlib-1.1.5.tar.gz
(9.1 kB
查看哈希)
内置分布
dictlib-1.1.5-py3-none-any.whl
(20.4 kB
查看哈希)