从描述嵌套属性的字符串(点语法)转到访问这些嵌套属性

2024-04-26 00:49:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我要修改包含嵌套属性的参数,这些属性需要按以下方式修改:

parameters.foo.bar.set(newvalue)

我想通过这种方式访问几十个值

我怎样才能创建一个不需要eval就可以执行以下操作的函数:

def change_params(dict_new_values):
    global parameters
    for key,val in dict_new_values.items():
        eval("parameters."+key+".set(val)")

我的问题是eval可以说是不安全的,因为字典的值来自外部

我目前的解决方法是逐个检查path\u参数可能具有的所有值,但要更新可能值的列表确实很不方便。这是我说服同事我可以安全使用eval的唯一方法,但eval仍然使代码难以阅读和维护:

list_possible_values=set(["foo.bar","foo.boz","otherparamname","yetanother.path"])
def change_params(dict_new_values):
    global parameters
    for key,val in dict_new_values.items():
        if key in list_possible_values:
            eval("parameters."+key+".set(val)")

对于那些了解JavaScript的人,我在python3中寻找能够实现这一点的lodash.getlodash.set的等价物


Tags: keyinnew参数属性foodefeval
1条回答
网友
1楼 · 发布于 2024-04-26 00:49:51

使用

getattr(parameters, key).set(val)

如果你需要属性的属性,我想你可以这样做:

attrs = key.split(".")
getattr(attrs[1], getattr(parameters, attrs[0])).set(val)

但是请注意,getter和setter是非语法的,应该改用properties

相关问题 更多 >