oob*_*boo 23 python eval dynamic
eval()Python中有一个函数我在玩游戏时偶然发现.我不能想到需要这个功能的情况,除了可能是语法糖.谁能举个例子?
Ale*_*lli 43
eval并且exec是动态获取一些源代码的方便快捷方式,可能会稍微麻烦一点,然后执行它 - 但它们几乎不是最好的方式,特别是在生产代码中,而不是"快速 - 和 -肮脏的"原型&c.
例如,如果我不得不处理这样的动态Python源代码,那么我会触及ast模块 - ast.literal_eval比eval你更安全(你可以直接在表达式的字符串形式上调用它,如果它是一次性的并依赖它仅在简单常数上,或先做node = ast.parse(source),然后保持node周围,也许与适当的访问者进行混合,例如变量查找,然后literal_eval是节点) - 或者,一旦将节点置于适当的形状并审查其安全问题,我就可以compile它(产生一个代码对象)并构建一个新的函数对象.远不那么简单(除了最简单的情况ast.literal_eval就这么简单eval!)但在生产质量的代码中更安全,更可取.
对于许多任务,我见过的人(AB-)使用exec和eval进行,Python的功能强大的内置插件,如getattr和setattr,索引到globals(),&C,提供最好而事实上往往简单的解决方案.对于特定用途,例如解析JSON,库模块等json更好(例如,请参阅SilentGhost对tinnitus对此问题的回答的评论).等等......
rob*_*rob 13
您可能希望使用它来允许用户输入自己的"scriptlet":小表达式(甚至小函数),可用于自定义复杂系统的行为.
在这种情况下,如果您不必过多关注安全隐患(例如,您拥有受过良好教育的用户群),那么eval()可能是一个不错的选择.
在我曾经编写的一个程序中,您有一个输入文件,您可以在其中将几何参数指定为值和先前值的 python 表达式,例如:
a = 10.0
b = 5.0
c = math.log10(a/b)
Run Code Online (Sandbox Code Playgroud)
Python 解析器读取此输入文件并使用 eval() 评估值和表达式获得最终数据。
我并不认为这是一个很好的编程,但我不必驱动核反应堆。
在过去,我使用eval()为我的应用程序添加调试接口.我创建了一个telnet服务,它将您置于正在运行的应用程序的环境中.输入通过eval()运行,因此您可以在应用程序中以交互方式运行Python命令.