Python: exec 总是不好的做法吗?如果是的话为什么不弃用

zvi*_*fer 5 python python-exec

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

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

gon*_*opp 5

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

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

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

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


Sin*_*ion 3

不,无论从什么角度来看 eval,相关工具并不总是坏事。

有很多东西只有当它们被表达为带有常规、位置或关键字参数(不是 magic或args)的常规函数​​时才能正常工作。没有办法动态创建具有所需参数集的函数,除非使用.*args**keywordseval

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

另一个更全面的例子eval是 Finedecorator库,它将这种实践概括为一系列工具,允许您动态创建具有特定函数签名的函数;它eval在内部使用。