有人可以想到一个使用exec的良好实践的例子吗?
如果总有一种更有效,更安全的方法来替换exec,为什么python不会弃用exec?
答案 0 :(得分:3)
正如other questions中所述,eval
/ exec
被视为不良做法,因为他们通常<强烈>滥用来执行任务它们不是必需的,导致潜在的安全问题和一般糟糕的编程。
然而,这些机制有一些有效的用途,它们暴露了其他地方无法实现的重要功能 - 在运行时执行任意代码。
想象一下,例如,您希望编写一个自我更新的应用程序。您可以从使用exec
运行的远程URL获取脚本,并将应用程序更新到最新版本。虽然做这样的事情本身会带来很大的安全隐患,但通过使用数字签名来确保过程安全并不困难。
您可以在code
module source中找到另一种常见用法:在运行时从用户执行代码输入以进行调试。
答案 1 :(得分:2)
不,eval
及相关工具无论如何都总是不好。
当它们被表达为具有常规,位置或关键字参数的常规函数(不是魔法*args
或**keywords
args)时,有很多东西只能很好 。除了eval
之外,没有办法动态创建具有所需参数集的函数。
有关如何使用它的一个很好的例子,请检查collections.namedtuple
的实现。虽然可以在没有eval
的情况下创建类似的工厂,但是它定义的所有功能,特别是__new__
和_replace
,都会有无用的帮助文本,并且会是没有它的便利工具。更糟糕的是,非eval实现几乎肯定是 SLOWER 。
精确使用eval
的另一个更全面的例子是精细decorator
库,它将这种做法概括为一组工具,允许您动态创建具有特定功能签名的函数;它在内部使用eval
。