4

有人能想出一个使用 exec 的良好实践示例吗?

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

4

2 回答 2

4

正如其他 问题中所解释的那样,eval/exec被认为是不好的做法,因为它们通常被滥用来执行不需要的任务,从而导致潜在的安全问题和通常的不良编程。

然而,这些机制有一些有效的用途,它们公开了其他地方没有的重要功能——在运行时执行任意代码。

例如,想象一下,您想编写一个可以自我更新的应用程序。您可以从远程 URL 获取脚本,该脚本与exec您的应用程序一起运行并将其更新到最新版本。虽然这样做本身会带来很大的安全隐患,但通过使用数字签名使过程安全并不难。

code您可以在模块 代码中找到另一个常见用途:在运行时执行用户输入的代码以进行调试。

于 2014-02-04T13:31:40.840 回答
2

不,从任何角度来看,eval相关工具并不总是不好的。

有许多事情只有在它们表示为具有常规、位置或关键字参数(不是魔术或args)的常规函数​​时才能正常工作。除了.*args**keywordseval

有关如何使用它的一个很好的例子,请检查collections.namedtuple. 尽管可以在没有 的情况下创建这样的类工厂eval,但是它定义的所有函数,__new__特别_replace是,将有无用的帮助文本,并且没有它将是一个不太方便的工具。更糟糕的是,非 eval 实现几乎肯定会是SLOWER

另一个关于这种精确使用的更全面的例子eval是fine decoratorlibrary,它将这种做法推广到一组工具中,这些工具允许您动态地创建具有特定函数签名的函数;它在eval内部使用。

于 2014-02-04T13:33:54.103 回答