跳转到主要内容

遍历嵌套字典并处理它

项目描述

dict8

功能

  • 无模板:只需a,b,path和一些代码。

  • 允许您为树中的每一部分定义特定的合并行为。

  • 合并到datclasses或attrs。

内部

默认机制将所有输入数据转换为Mapper。如果 ab 是可映射的,新值、公共值和旧值将被带到自定义函数中,以决定值的优先级。返回 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 查看哈希值)

上传于 Python 2 Python 3

由以下支持