从 python 中的点表示法字符串设置嵌套对象属性

use*_*348 1 python split for-loop nested

I\xe2\x80\x99m 编写一个函数,该函数接受父对象data和一个字符串inputString,该字符串可能包含也可能不包含点符号来表示嵌套对象(即 \xe2\x80\x98nestedObject.itemA)。该函数应将inputString的属性设置data为随机字符串。如果字符串inputString是嵌套对象,则该函数应将nested object\xe2\x80\x99s 值设置为随机字符串。我可以\xe2\x80\x99t弄清楚如何在for循环中处理这一切。我想做这样的事情:

\n\n
split_objects = value.split(\xe2\x80\x9c.\xe2\x80\x9d)\nfor item in split_objects:\n    data.__setattr__(item, get_random_string())\n
Run Code Online (Sandbox Code Playgroud)\n\n

但是,对于嵌套对象,上面的代码会将嵌套对象设置为随机字符串,而不是内部的字段。有人可以帮助我处理这两种情况的语法吗?预先感谢\xe2\x80\xa6

\n

Boa*_*les 5

您需要先获得 的引用,data.nestedObject然后才能使用setattr进行更改data.nestedObject.itemA

prefix, suffix = value.rsplit(".",1)
# now prefix is nestedOjbect and suffix is itemA
ref = getattr(data,prefix)
setattr(ref,suffix,get_random_string())
Run Code Online (Sandbox Code Playgroud)

您需要获取参考的次数与 中的点一样多inputString。所以,如果你有一个任意深度嵌套的结构data

value = "nestedObject.nestedObject2.nestedObject3.itemA"
path, attribute = value.rsplit(".",1)
path = path.split(".")
ref = data
while path:
    element, path = path[0], path[1:]
    ref = getattr(ref, element)
setattr(ref, attribute, get_random_string())
Run Code Online (Sandbox Code Playgroud)