首页 > 解决方案 > 评估一个字符串,就好像它是通过点运算符连接的一样

问题描述

我有以下代码:

class foo():
    def __init__(self, local_dict):
        self.local_dict = local_dict

    def acquire(self, foreign_dict, *args):
        to_exec = ''
        for arg in args:
            to_exec += ('.get(\'%s\', {})' %arg)

调用foo.acquire(some_dict, 'CLIENT1', 'OWED')make的地方to_exec类似于:

.get('CLIENT1', {}).get('OWED', {})

这意味着访问任意深度嵌套的字典foreign_dict,同时确保失败的尝试不会阻塞程序。我的问题是,我如何运行这个字符串,就好像它正在调用 dict 的方法一样,即,我将如何返回这样的东西:

return foreign_dict.get('CLIENT1', {}).get('OWED', {})

如果我只有字符串'.get('CLIENT1', {}).get('OWED', {})'

在我的代码中,如果我执行以下操作,一切都会好起来的:

def acquire(self, *args):
    to_exec = 'self.local_dict'
    for arg in args:
        to_exec += ('.get(\'%s\', {})' %arg)
    return eval(to_exec)

但它在这里工作得很好,因为我知道self.local_dict的变量名并且它不是从输入中获取的。有什么方法可以让字符串像与点运算符连接到外部输入一样运行,即让它运行为 return foreign_dict.get('CLIENT1', {}).get('OWED', {})?有没有类似的东西:dot_operator(foreign_dict, eval(to_exec))?因为foreign_dict.eval(to_exec)行不通。

标签: pythonstringdictionary

解决方案


要严格回答您的答案eval,您想要的可能是locals(evaleval3 个参数) 的参数:

     def acquire(self, foreign_dict, *args):
         to_exec = 'foreign_dict'
         for arg in args:
             to_exec += ('.get(\'%s\', {})' %arg)
         return eval(to_exec, globals(), {'foreign_dict': foreign_dict})

但就您而言,您似乎实际上并不需要使用eval. 您可以在循环中重新分配一个变量,然后get使用它。就像是

temp = foreign_dict.get(args[0], {})
for arg in args[1:]:
    temp = temp.get(arg, {})
return temp

推荐阅读