代码之家  ›  专栏  ›  技术社区  ›  trixn

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

  •  5
  • trixn  · 技术社区  · 6 年前

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

    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)
    

    上述调用/分配应替换 3 5 .

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

    解决方案应该大致类似于npm包 object-path 在javascript中执行。

    2 回复  |  直到 6 年前
        1
  •  4
  •   Eugene Yarmash    6 年前

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

    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
    
        2
  •  3
  •   L3viathan gboffi    6 年前

    听起来像是递归和 str.partition :

    def set_value(obj, path, val):
        first, sep, rest = path.partition(".")
        if first.isnumeric():
            first = int(first)
        if rest:
            new_obj = obj[first]
            set_value(new_obj, rest, val)
        else:
            obj[first] = val
    

    因为 1 "1"

    您可以让它在自定义对象上运行,但在没有可怕的黑客攻击的情况下不能真正在内置类型上运行,因为Python没有等价于 object.prototype