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

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供内部使用(引发错误)
  • 由于名称空间冲突问题,您必须小心输入哪些键
  • 每个非标记化名称都存在两个密钥,如^ {CD24}}, 标记为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}}}'

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java在未知属性上的PUT和POST失败会引发不同的行为   java无法使GWTRPC正常工作   java如何在安卓中更改一个特定视图的主题?   机器学习为什么改变了java中等式的两面?   java继承和重定向标准输出   java为什么Clojure中嵌套循环/重复速度慢?   使用JavaParser解析Java代码并查找父节点的语句类型   java读取类的方法并在arraylist中存储Web服务的路径名   java模板聚合匹配和投影一个没有id的字段   java为什么给定数组不返回false   java如何链接JLabel和JSpinner以调整大小   在java中,当过滤器只返回一个对象时,如何使用流和过滤器将值填充到对象中   java为什么使用getInstance   如何得到我的。运行java命令的bat文件