python - 评估一个字符串,就好像它是通过点运算符连接的一样
问题描述
我有以下代码:
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)
行不通。
解决方案
要严格回答您的答案eval
,您想要的可能是locals
(eval
有eval
3 个参数) 的参数:
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
推荐阅读
- javascript - 如何用字符串数组过滤数组
- c# - 无法在 HtmlRenderer.PdfSharp ASP.NET Core 中使用分页符
- discord.py - Discord.py 在频道命令中取消固定消息?
- vue.js - ';' 尝试映射到对象数组时预期
- python - 解析:Python中类方法的功能继承
- database - 对 Apache HBase 基础知识感到困惑?
- javascript - 如何在不打开新标签的情况下播放音频文件
- ios - 从 QRCode 中的自定义 URL 打开 iOS 应用程序
- android - 如何在 WebView Android App 中启用谷歌翻译
- hibernate - Hibernate Criteria 取第一条记录