分享
三行代码  ›  专栏  ›  技术社区  ›  shintuku

Python:计算一个字符串,就像它是由点运算符连接的一样

  •  0
  • shintuku  · 技术社区  · 1 周前

    我有以下代码:

    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') 制造 to_exec 变得像:

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

    它的意思是访问任意深度嵌套的字典 foreign_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) 不起作用。

    1 回复  |  直到 1 周前
        1
  •  3
  •   Pat-Laugh    1 周前

    eval locals 的参数 评估 ( 评估

         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})
    

    但在你的情况下,你似乎并不需要使用 评估 get 用它。有点像

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