Python:exec总是不好的做法,如果是这样,为什么不弃用

时间:2014-02-04 13:18:20

标签: python python-exec

有人可以想到一个使用exec的良好实践的例子吗?

如果总有一种更有效,更安全的方法来替换exec,为什么python不会弃用exec?

2 个答案:

答案 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