有一个eval()
Python函数中,我偶然发现而玩弄。 当需要这种功能,也许除了作为语法糖我不能想到一个情况。 谁能举个例子?
Answer 1:
eval
和exec
都得心应手快速和肮脏的方式来动态地获取一些源代码,也许Munge时间这一点,然后执行它-但他们几乎没有最好的方式,尤其是在生产代码,而不是“单触和肮脏的”原型&C。
举例来说,如果我有对付这种动态的Python源,我端起AST模块- ast.literal_eval
是远远超过安全eval
(你可以直接调用它表达的字符串形式,如果它是一个-off并依赖于简单的常量,或者仅做node = ast.parse(source)
,然后再保持node
周围,也许Munge时间将其与合适的访问者例如用于变量查找,然后literal_eval
节点) -或,一旦已经把在适当的形状节点和审核它的安全问题,我可以compile
它(得到代码对象),并建立一个新的函数对象了这一点。 远不如简单的(除了ast.literal_eval
是一样简单eval
为最简单的情况!),但安全生产质量的代码和优选。
对于许多任务,我见过的人(AB-)使用exec
和eval
的,Python的功能强大的内置插件,如getattr
和setattr
,索引到globals()
提供最好而事实上往往简单的解决方案。 对于具体的用途,如解析JSON,库模块,如json
是更好的(如见耳鸣的回答SilentGhost的评论来过这个问题)。 等等,等等......
Answer 2:
在维基百科上的文章eval
是相当翔实,并且细节上的各种用途。
一些它表明的用途是:
- 评估数学表达式
- 编译器引导
- 脚本(一般动态语言都非常适合这个)
- 语言导师
Answer 3:
你可能想用它来让用户输入自己的“脚本小程序”: 小表达式(或者更小的功能),可用于定制一个复杂系统的行为。
在这种情况下,如果你也不必太在意了安全隐患(例如,您有一个受过教育的用户群),然后的eval()可能是一个不错的选择。
Answer 4:
在过去,我已经使用的eval()在调试接口添加到我的应用程序。 我创建了下降到你运行的应用程序的环境中的Telnet服务。 输入是通过运行的eval(),所以你可以以交互方式运行Python应用程序中的命令。
Answer 5:
在程序中我曾经写过,你有一个输入文件,你可以指定几何参数既是值和先前的值,例如Python表达式:
a=10.0
b=5.0
c=math.log10(a/b)
一个Python解析器读取此输入文件,并使用eval获得的最终数据评价值和表达式()。
我不要求它是良好的编程,但我没有开车核反应堆。
Answer 6:
我用它作为一个快速JSON解析器...
r='''
{
"glossary": {
"title": "example glossary"
}
}
'''
print eval(r)['glossary']['title']
Answer 7:
eval()
通常不是非常有用的。 有一个问题我已经为它用的几样东西(当然,这是exec()
实际,但它是非常相似)是允许用户脚本,我用Python写了一份申请。 如果它被写在像C ++,我会嵌入在应用程序中的Python解释器。
Answer 8:
EVAL是在程序中使用Python解释器交互的方式。 你可以通过文字来评估和它评估它们作为Python表达式。
例如 -
print eval("__import__('os').getcwd()")
将返回当前工作目录。
干杯
Answer 9:
您可以在装饰使用eval:
#this replaces the original printNumber with a lambda-function,
#which takes no arguments and which calls the old function with
#the number 10
@eval("lambda fun: lambda: fun(10)")
def printNumber(i: int) -> None:
print("The number is %i", i)
#call
printNumber()
虽然你不能像使用复杂的表达式
@lambda fun: lambda: fun(10)
def ...
也不
@(lambda fun: lambda: fun(10))
def ...
你不能使用lambda表达式那里,因为装饰要么是一个标识符:
@myModule.functionWithOneArg
或者一个函数调用:
@functionReturningFunctionWithOneArg(any, "args")
你看到这个函数的eval一个字符串调用具有有效的语法在这里,但在lambda表达式没有。 ( - > https://docs.python.org/3/reference/compound_stmts.html#function-definitions )
Answer 10:
我它用于输入变量值到主程序:
test.py VAR1 = 2 VAR2 =真
...
var1=0
var2=False
for arg in sys.argv[1:]:
exec(arg)
粗方式允许在程序主关键字ARGS。 如果有更好的方式让我知道!
Answer 11:
的eval()是用于单句,而EXEC()是用于多者。
通常我们用它来添加或访问一些脚本就像bash shell的。
因为它们可以在内存中运行一些字节的脚本,如果你有一些重要的数据或脚本可以解码和解压您的“秘密”,然后做一切你想做的。
Answer 12:
我只是碰到一个良好的使用eval来了。 我在写一个测试套件一些代码,并创建了一个测试类,其中每一个方法是要运行的测试。 我就想了一个办法,这样我可以运行所有的测试方法,而不必单独调用每个方法。 所以,我写的东西比较脏。
class Test:
def __init__(self, *args):
#bs
def test1(self):
#bs
def test2(self):
#bs
if __name__ == "__main__":
import argparse
#argparse bs
test = Test(*bs_args)
for func in (i for i in dir(test) if i[0] != '_' and i not in test.__dict__):
print(eval('test.{func}()'.format(func = func)))
任意测试用例动态评价是很酷。 我只是写的方法,并保存后,我可以加入我的测试套件的方法。 至于代码,我基本上只是检查测试对象定义的方法,并确保它们不会默认的Python的“神奇”的方法或属性的测试对象。 从那以后,我可以假设它们的方法和进行评估。
Answer 13:
我使用exec
在Python创建的插件系统。
try: exec ("from " + plugin_name + " import Plugin") myplugin = Plugin(module_options, config=config) except ImportError, message: fatal ("No such module " + plugin_name + \ " (or no Plugin constructor) in my Python path: " + str(message)) except Exception: fatal ("Module " + plugin_name + " cannot be loaded: " + \ str(sys.exc_type) + ": " + str(sys.exc_value) + \ ".\n May be a missing or erroneous option?")
有了一个插件,如:
class Plugin: def __init__ (self): pass def query(self, arg): ...
您将能够这样称呼它:
result = myplugin.query("something")
我不认为你可以在Python的插件没有exec
/ eval
。