美文网首页
Box 为你的字典添加点符号访问特性

Box 为你的字典添加点符号访问特性

作者: 程序员小西 | 来源:发表于2021-12-27 16:01 被阅读0次

    正常情况下,我们想访问字典中的某个值,都是通过中括号访问,比如:

    test_dict = {"test": {"imdb stars": 6.7, "length": 104}}

    print(test_dict["test"]["imdb stars"])

    # 104

    而通过Box模块,我们可以扩展字典功能,使用点符号访问元素:

    from box import Box

    movie_box = Box({ "Robin Hood: Men in Tights": { "imdb stars": 6.7, "length": 104 } })

    movie_box.Robin_Hood_Men_in_Tights.imdb_stars

    # 6.7

    另外,可以看到默认情况下转换后,字典键值中的空格被转化为了下划线。

    下面具体介绍 Box 模块的使用方法。

    1.准备

    开始之前,你要确保Python和pip已经成功安装在电脑上,如果没有, 进行安装。

    (可选1) 如果你用Python的目的是数据分析,可以直接安装Anaconda:它内置了Python和pip.

    (可选2) 此外,推荐大家用VSCode编辑器,它有许多的优点

    请选择以下任一种方式输入命令安装依赖: 1. Windows 环境 打开 Cmd (开始-运行-CMD)。 2. MacOS 环境 打开 Terminal (command+空格输入Terminal)。 3. 如果你用的是 VSCode编辑器 或 Pycharm,可以直接使用界面下方的Terminal.

    pip install --upgrade python-box[all]

    2.基本使用

    我们可以像文章开头那样传入一个字典给 Box,生成一个Box对象;也可以直接使用参数赋值的方式生成一个Box对象:

    from box import Box

    my_box = Box(funny_movie='Hudson Hawk', best_movie='Kung Fu Panda')

    my_box.funny_movie

    # 'Hudson Hawk'

    请记住,任何情况下,你往Box对象里添加字典或是数组,这些字典或数组都会被转变为Box对象:

    my_box = Box({"team": {"red": {"leader": "Sarge", "members": []}}})

    print(my_box.team.red.leader)

    # Sarge

    my_box.team.blue = {"leader": "Church", "members": []}

    print(repr(my_box.team.blue))

    # <Box: {'leader': 'Church', 'members': []}>

    访问列表中的 Box 对象也非常轻松:

    my_box.team.red.members = [

        {"name": "Grif", "rank": "Minor Junior Private Negative First Class"},

        {"name": "Dick Simmons", "rank": "Captain"}

    ]

    print(my_box.team.red.members[0].name)

    # Grif

    局限性

    请注意,字典中有些默认方法,如:clear, copy, fromkeys, get, items, keys, pop, popitem, setdefault, to_dict, update, merge_update, values ,当你的键值和这些方法名称冲突时,你无法使用点符号访问它们。

    不过冲突时,你依然可以使用传统的字典取值访问它们,例如:

    my_box['keys']

    合并

    要合并两个Box对象,你只需要通过 merge_update 方法:

    from box import Box

    box_1 = Box(val={'important_key': 1})

    box_2 = Box(val={'less_important_key': 2})

    box_1.merge_update(box_2)

    print(box_1)

    # {'val': {'important_key': 1, 'less_important_key': 2}}

    当然,你也可以用传统的 update 方法:

    from box import Box

    box_1 = Box(val={'important_key': 1})

    box_2 = Box(val={'less_important_key': 2})

    box_1.update(box_2)

    print(box_1)

    # {'val': {'less_important_key': 2}}

    转换为原始列表/字典

    如果你需要把一个 Box 对象的字典转化为原始字典,.to_dict() 方法就可以帮你实现:

    from box import Box

    box_1 = Box(val={'important_key': 1})

    print(box_1)

    # {'val': {'less_important_key': 2}}

    print(type(box_1))

    # <class 'box.box.Box'>

    print(type(box_1.to_dict()))

    # <class 'dict'>

    如果你需要把一个 Box 对象的列表转化为原始列表,你可以使用 .to_list() 方法:

    from box import BoxList

    my_boxlist = BoxList({'item': x} for x in range(10))

    # <BoxList: [<Box: {'item': 0}>, <Box: {'item': 1}>, ...

    my_boxlist[5].item

    # 5

    print(type(my_boxlist.to_list()))

    # <class 'list'>

    3.导入导出功能

    Box对象有一个很方便的功能,就是能够轻松地将Box对象导出为Json / yaml / csv / msgpack 文件:

    from box import BoxList

    my_boxlist = BoxList({'item': x} for x in range(10))

    # <BoxList: [<Box: {'item': 0}>, <Box: {'item': 1}>, ...

    my_boxlist.to_json(filename="test.json")

    # 在当前文件夹下生成一个 test.json 文件

    此外,还能接受 Json / yaml / csv / msgpack 文件导入:

    new_box = Box.from_json(filename="films.json")

    各种类型的文件对应的方法如下:

    转换器方法描述

    to_dict递归地将所有 Box(和 BoxList)对象转换回字典(和列表)

    to_json将 Box 对象另存为 JSON 字符串或使用filename参数写入文件

    to_yaml将 Box 对象另存为 YAML 字符串或使用filename参数写入文件

    to_msgpack将 Box 对象另存为 msgpack 字节或使用filename参数写入文件

    to_toml*将 Box 对象另存为 TOML 字符串或使用filename参数写入文件

    to_csv**将 BoxList 对象另存为 CSV 字符串或使用filename参数写入文件

    from_jsonClassmethod,从一个 JSON 文件或字符串创建一个 Box 对象(所有 Box 参数都可以传递)

    from_yaml类方法,从 YAML 文件或字符串创建一个 Box 对象(所有 Box 参数都可以传递)

    from_msgpackClassmethod,从msgpack文件或字节创建一个Box对象(所有Box参数都可以传递)

    from_toml*Classmethod,从TOML文件或字符串创建一个Box对象(所有Box参数都可以传递)

    from_csv**Classmethod,从一个CSV文件或字符串创建一个BoxList对象(可以传递所有BoxList参数)

    不适用于 BoxList,仅适用于 Box ** 不适用于 Box,仅适用于 BoxList。

    相关文章

      网友评论

          本文标题:Box 为你的字典添加点符号访问特性

          本文链接:https://www.haomeiwen.com/subject/zspyqrtx.html