如何在给定虚线路径的对象上设置属性?

tri*_*ixn 5 python

给定一个对象可以是类似dict或类似数组的对象的嵌套结构.在给定虚线路径作为字符串的情况下,在该对象上设置值的pythonic方法是什么?

例:

obj = [
    {'a': [1, 2]},
    {'b': {
        'c': [3, 4],
    }},
]

path = '1.b.c.0'

# operation that sets a value at the given path, e.g.
obj[path] = 5

# or
set_value(obj, path, 5)
Run Code Online (Sandbox Code Playgroud)

上面的调用/赋值应该3用a 替换示例中的5.

注意:路径可以包含列表索引和键.对象的每个级别可以是一个array或一个dict或类似的行为.

解决方案应该与npm包object-path在javascript中的工作方式大致相同.

Eug*_*ash 4

非递归版本,也适用于数字字典键:

from collections.abc import MutableMapping

def set_value_at_path(obj, path, value):
    *parts, last = path.split('.')

    for part in parts:
        if isinstance(obj, MutableMapping):
            obj = obj[part]
        else:
            obj = obj[int(part)]

    if isinstance(obj, MutableMapping):
        obj[last] = value
    else:
        obj[int(last)] = value
Run Code Online (Sandbox Code Playgroud)

  • 我更喜欢这种方法,原因有两个:首先,因为它避免了不必要的递归,其次,因为它依赖数据结构来确定如何解释路径中的标记,而不是相反。 (2认同)
  • 为了覆盖`__setitem__`,根据[此处](https://docs.python.org/3.7/library/collections.abc.html)的表格,我猜它应该是`MutableMapping`。 (2认同)