使用python dicts进行智能操作的工具
ker-dict-tools的Python项目详细描述
Ker_dict_工具
操作python命令的智能工具。
- dict_diff():比较两个报告差异的dict的函数。
- 按路径获取值(get_value_by_path():从通过指向它们的路径的dict中获取单个或多个值。
- 按路径设置值::在通过指向它的路径的嵌套dict中设置值。
"路径"概念:
我需要一种聪明的方法来访问dict,dict的结构可能会发生不可预测的变化(例如嵌套的dict列表),从而使它们与其他对象建立关系。 因此,我开发了"get_value_by_path()"和"set_value_by_path()"函数,使我能够安全快速地访问这些值。 路径是一个值列表,每个值都指向dict的子序列级别。 例如,给定dict:
dct = {
"foo": [
{"bar":1},
{"baz":2}
]
}
访问值2的路径是:
[
"foo", # Key for outer level of the dict
1, # Index for list contained in the "foo" value
"baz" # Key for dict at index 1 of the list
]
由于设计用于实际dict可能部分未知的上下文中,定义要使用的路径的入口点是get_value_by_path()函数,wich接受一个更"弹性"的列表(允许对dict进行简单的查询)。
按路径获取u值(dct,path,fail=false,debug=false)
允许检索存储在dctdict中某个位置的值(或多个值),前提是给定的路径正确(对应于dict的结构)。 dct参数可以是dict或dict列表。 如果传递fail参数(true),当路径中的元素与应用的dctdict所在的层不对应时,将引发typeerror异常。否则,函数将返回一个空namedtuple,其中0作为的值。found属性。 如果传递了debug参数(true),则函数将以debug级别记录(使用logging模块)。
当传递到按路径获取值时,路径列表中的接受值
<表><广告>dict层类型
接受值
< /广告><正文>听写列表 int(列表索引) dict(key:value要在列表中的一个或多个dict中匹配的对) 列表(dict)(包含一个键:value对的dict列表,所有这些都将在列表中的一个或多个dict中匹配) str(在列表中包含的dict键中找到键) 字符串"*"(通配符返回列表中的所有元素) dict str(dict键) 字符串"*"(返回dict中所有项的通配符) 例如:
dct = [
{ "foo": [{"bar":1, "baz":2},{"bar":3, "baz":4}] },
{ "foo": [{"bar":5, "baz":6},{"bar":7, "baz":8}] },
]
path1 = [0, "foo", {"bar":1}, "baz"]
path2 = [0, "foo", 0, "baz"]
路径1和路径2
将导致值2。
用:path3 = [0, "foo", "*", "baz"]
dct = [
{ "foo": [{"bar":1, "baz":2},{"bar":3, "baz":4}] },
{ "foo": [{"bar":5, "baz":6},{"bar":7, "baz":8}] },
]
path1 = [0, "foo", {"bar":1}, "baz"]
path2 = [0, "foo", 0, "baz"]
path3 = [0, "foo", "*", "baz"]
路径3将导致值2和4
返回的对象
函数将返回一个dict_search对象。
res = get_value_by_path(myDict, myPath)
res => 'dict_search'(
found=n, # -> number of matches
results=[
dict_branch(
path={list1} # Path leading to the value #1
value={value1} # Value #1
),
dict_branch(
path={list2} # Path leading to the value #2
value={any} # Value #2
),
...
]
)
函数将返回一个'dict_search'namedtuple,包含两个属性:
- 。找到{int}:dict中与给定路径匹配的元素数
- .results{list}:名为duples的dict分支的列表,每一个都指定了与给定路径匹配的元素的路径和值。
dict_branch命名双结构:
- .path{list}:"normalized"指向值的路径(仅包含dict键或列表索引)
- 。值{any}:在指定的路径中找到的值
使用get_value_by_path()查询dict
也可以验证给定的值是否存在于dict的某一层,该层将指向它的路径作为路径传递,并指定要在路径列表中查找的值作为最后一项。 函数返回一个namedtuple,它在索引0(。found)处指定给定路径的匹配数。
按路径设置u值(dct,path,value,debug=false)
允许在用给定路径指定的dctdictdict的特定位置设置给定的值。 根据dict的结构,path参数必须是ints或strings的列表(例如,在dict search对象fromget戋value戋by戋path()中返回的字符串)。
diff指令(dct1,dct2,fail=false,startpath=none)
从dct1和dct2指令执行比较。 这两个参数必须属于同一类型(bot-lists of dict或simple dict)。 返回一个'diff_results'对象,包含四个属性:
- 。比较{bool}:如果比较没有问题,则为true。
- 。已更新{list}:已更新项的列表'namedtuple(见下文)包含有关两个dict中存在但具有不同值的元素的信息。
- 。添加了{list}:指向dct2中找到但不在dct1中找到的元素的路径列表。
- 。已删除{list}:指向dct1中找到但不在dct2中找到的元素的路径列表。
updated_itemnamedtuple填充列表。updated具有以下结构:
- .path{list}:指向更新元素的路径。
- 。旧值{any}:元素的旧值。
- 。旧类型{type}:元素值的旧类型。
- 。新值{any}:元素的新值。
- 。new_type{type}:元素值的新类型。