使用 exec() eval() 方法时如何克服格式化字符串的限制?

Posted

技术标签:

【中文标题】使用 exec() eval() 方法时如何克服格式化字符串的限制?【英文标题】:How to overcome formatted string limitations when using exec() eval() method? 【发布时间】:2021-05-23 15:39:36 【问题描述】:

由于 eval/exec 功能的限制,我遇到了问题

由于 exec 和 eval 不会自动适应正确的类型(因为我们在格式化字符串中),在(很多)需要代码生成的情况下,这种格式化字符串评估方法将不起作用(参见示例下面)。

所以我问社区是否有更聪明的方法来创建这种 API 生成

例子:

# *context: writing automation using software api*
# I need to apply the dict values to the API, to do so I will use exec()

dict =  
    "api"   : "value"
    "count" : 5
    "name" : "MyCustomName"
    "color" : [1,0,0]


import API 

for key,value in dict.items():
    exec(f"API.key = value") #this won't work because value type isn't supported in formatted string 

【问题讨论】:

您不需要执行此操作 啊?我错过了什么明显的东西吗? 几乎从不需要评估。几乎总是有另一种方式,除非你做的事情非常不寻常,否则你可以摆脱“几乎”。 确实,我希望我早点知道 setattr() ! 除非您的实际目标是动态评估代码,否则 eval/exec 永远不是解决方案。 【参考方案1】:

exec 是不必要的,直接使用setattr

for key,value in dict.items():
    setattr(API, key, value)

旁注:不要命名变量dict,它会影响内置函数。

【讨论】:

以上是关于使用 exec() eval() 方法时如何克服格式化字符串的限制?的主要内容,如果未能解决你的问题,请参考以下文章

python中执行字符串形式的语句和字符串形式的表达式方法(即exec和eval方法)

exec()和eval()

eval、exec 和 compile 有啥区别?

exec与eval函数的使用

如何使用python 执行命令行传入的代码

Python进阶-pickle/eval/exec