Python:exec总是不好的做法吗?如果是,为什么不反对

Python:exec总是不好的做法吗?如果是,为什么不反对,python,python-exec,Python,Python Exec,有人能想出一个使用exec的良好实践的例子吗 如果总是有一种更高效、更安全的方法来取代exec,为什么python不反对exec?如中所述,eval/exec被认为是不好的做法,因为它们通常被滥用来执行不需要它们的任务,导致潜在的安全问题和通常糟糕的编程 然而,这些机制有一些有效的用途,它们公开了其他地方不可用的重要功能——在运行时执行任意代码 例如,假设您想要编写一个自我更新的应用程序。您可以从使用exec运行的远程URL获取脚本,并将应用程序更新为最新版本。虽然这样做本身会带来巨大的安全隐患

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

如果总是有一种更高效、更安全的方法来取代exec,为什么python不反对exec?

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

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

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


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

否,
eval
和相关工具从任何角度来看都不总是坏的

有很多东西只有在用正则、位置或关键字参数表示为正则函数时才能很好地工作(不是magic
*args
**keywords
args)。除了使用
eval
之外,无法使用所需的参数集动态创建函数

有关如何使用此功能的示例,请检查
collections.namedtuple
的实现。虽然不使用
eval
就可以创建这样的类工厂,但是它定义的所有函数,尤其是
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。更糟糕的是,非评估实施几乎肯定会更慢


另一个更全面的例子是fine library,它在一系列工具中概括了这种做法,允许您动态创建具有特定函数签名的函数;它在内部使用
eval

转到相关问题
为什么应该避免exec()和eval()?
26在Python中,exec为什么不在具有子函数的函数中工作?
@GrijeshChauhan虽然有一些问题解释为什么
eval
/
exec
通常是一种不好的做法,没有实际良好实践的例子,因此我认为这是一个有效的方法question@goncalopp你是对的……这只是另一个例子:我制作了一个小的“框架”,通过模拟模块的依赖关系来完全解耦它们,从而允许测试不稳定的模块。也就是说,我正在编写代码,这些代码大部分表现得与原始代码类似,但也有一些地方。没有执行官这是不可能的,嗯?您可以使用
类型.FunctionType
动态创建函数,并传入代码对象。当然,我猜当你
编译
代码对象时,你是在幕后使用exec。是的,
编译
类型。code类型
具有
eval
exec
的所有功能和缺点。但是,如果您以这种方式动态创建函数,您可能应该优先使用
eval
,而不是显式地创建字节码,因为您必须评估的python可以跨实现移植,但字节码黑客通常不是。例如,
types.CodeType
的签名是实现定义的。继承
collections.Callable
可能更可取,在所有实际用途中,可调用类都是函数。我同意这个答案,但我确实质疑这句话的正确性:“除了eval之外,没有办法用所需的参数集动态创建函数。”@wim:我对一个反例感兴趣。具体地说,你能给我看一个
x
,它满足
inspect.getargspec(x(y))==inspect.getargspec(eval('lambda{0}:({0}')).format(','.join(y))
的要求,其中
y
是字符串列表(例如
y=['foo','bar','baz']