遍历嵌套字典并处理它
项目描述
dict8
功能
无模板:只需a,b,path和一些代码。
允许您为树中的每一部分定义特定的合并行为。
合并到datclasses或attrs。
内部
默认机制将所有输入数据转换为Mapper。如果 a 和 b 是可映射的,新值、公共值和旧值将被带到自定义函数中,以决定值的优先级。返回 missing
将会从中间结果中省略此键。选择的mapper将决定如何合并后面的内容。
dict8.merge
import dict8
@dict8.ion(DataclassMapper)
def merge(
a: t.Any,
b: t.Any,
path: Path = (),
/,
override: t.Optional[t.Callable] = None,
nothing_new: bool = False,
remove_old: bool = False,
keep_type: bool = False,
**kv: t.Any,
) -> t.Any:
"""Merge two mappable objects into one.
:param a: object a
:param b: object b
:param path: the path of keys
:param override: a function to override b
:param nothing_new: skip new keys if they ar not in a
:param remove_old: skip old keys if they are not in b
:param keep_type: b must have similar type like a
"""
...
自定义合并器
import dict8
@dict8.ion
def merge(a, b, path, /, **kv):
try:
# try descent into sub mappings
return merge(
a,
b,
path,
**kv,
)
except dict8.UnMappable:
# take b else a
return b if b is not dict8.missing else a
assert (
merge(
{
1: 2,
3: {4: 5},
},
{
3: {4: 2, 5: 1},
},
)
== {1: 2, 3: {4: 2, 5: 1}}
)
合并到attrs和数据类
import typing as t
import dataclasses as dc
import dict8
@dc.dataclass
class Foo:
my_value: int
some: str = "default"
@dc.dataclass
class Bar:
foo: Foo
baz: t.Optional[int] = None
bar = dict8.merge(Bar, {"foo": {"my_value": 123}})
assert bar == Bar(foo=Foo(my_value=123, some="default"), baz=None)
许可
这是公有领域。
项目详情
下载文件
下载适用于您平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。
源代码分发
dict8-0.4.0.tar.gz (6.1 kB 查看哈希值)
构建分发
dict8-0.4.0-py2.py3-none-any.whl (6.2 kB 查看哈希值)