Skip to main content

字典库,包括良好的深度合并和字典作为对象

项目描述

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 查看哈希)

已上传 source

内置分布

dictlib-1.1.5-py3-none-any.whl (20.4 kB 查看哈希

已上传 py3