在Python中使用eval?

Python中有一个eval()函数,我在玩的时候偶然发现了。 当我们不需要这个function的时候,除了可能是语法糖之外,我不能想到这种情况。 任何人都可以举个例子吗?

evalexec是方便快捷的方式,可以dynamic地获得一些源代码,也可以使用它,然后执行它 – 但是它们几乎不是最好的方法,特别是在生产代码中,而不是“肮脏的“原型&c。

例如,如果我不得不处理这样的dynamicPython源代码,那么我会达到ast模块 – ast.literal_evaleval更安全(您可以直接调用它的expression式的stringforms,如果它是一个-off并仅依赖于简单的常量,或者首先执行node = ast.parse(source) ,然后保持node周围,​​或许用合适的访问者来访问它,例如用于variables查找,然后是literal_eval节点)节点的形状正确,并审查它的安全问题,我可以compile它(产生一个代码对象),并build立一个新的function对象。 ast.literal_eval那么简单(除了ast.literal_eval就像最简单的情况一样简单!),但在生产质量代码中更安全和更可取。

对于许多我见过的人(ab-)使用execeval来说,python强大的内置eval ,比如getattrsetattr ,索引到globals() ,&c,提供了更好的,实际上更简单的解决scheme。 对于诸如parsingJSON的特定用途,诸如json类的库模块是更好的(例如,参见SilentGhost关于耳鸣对这个问题的回答的评论)。 等等等等

关于eval的维基百科文章是相当丰富的,并详细介绍了各种用途。

它build议的一些用途是:

  • 评估mathexpression式
  • 编译器引导
  • 脚本(一般来说dynamic语言非常适合这个)
  • 语言教师

您可能想要使用它来允许用户input自己的“scriptlet”: expression式(甚至小函数),可用于定制复杂系统的行为。
在这种情况下,如果你不必太在意安全问题(例如,你有一个受过良好教育的用户群),那么eval()可能是一个不错的select。

在过去我使用eval()来添加一个debugging接口到我的应用程序。 我创build了一个远程login服务,将您放到正在运行的应用程序的环境中。 input是通过eval()运行的,所以你可以在应用程序中交互地运行Python命令。

在我曾经写过的一个程序中,您有一个input文件,您可以在其中指定几何参数,既可以将值指定为以前值的pythonexpression式,例如:

 a=10.0 b=5.0 c=math.log10(a/b) 

一个Pythonparsing器读取这个input文件,并使用eval()来获得最终的数据和expression式。

我不认为这是很好的编程,但我不必驾驶核反应堆。

eval()通常不是很有用。 我使用过的一些东西(呃,实际上是exec() ,但它非常类似)允许用户编写我用Python编写的应用程序。 如果它是用C ++编写的,我将不得不在应用程序中embedded一个Python解释器。

Eval是一种从程序内部与Python解释器进行交互的方式。 您可以将文字传递给eval,并将它们评估为pythonexpression式。

例如 –

 print eval("__import__('os').getcwd()") 

会返回当前的工作目录。

干杯

我用它作为一个快速的JSONparsing器…

 r=''' { "glossary": { "title": "example glossary" } } ''' print eval(r)['glossary']['title'] 

我用它来向主程序inputvariables值:

test.py var1 = 2 var2 = True

 var1=0 var2=False for arg in sys.argv[1:]: exec(arg) 

在主程序中允许使用关键字参数的粗略方法。 如果有更好的方法让我知道!

eval()用于单个句子,而exec()用于多个。

通常我们使用它们来添加或访问一些像bash shell一样的脚本。

因为他们可以在内存中运行一些字节脚本,如果你有一些重要的数据或脚本,你可以解码和解压缩你的“秘密”,然后做你想做的一切。

我刚刚遇到了eval的一个很好的使用。 我正在为一些代码编写testing套件,并创build了一个Test类,其中每个方法都是要运行的testing。 我想要一个方法,以便我可以运行所有的testing方法,而无需单独调用每个方法。 所以,我写了一些很脏的东西。

 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))) 

任意testing用例的dynamic评估非常酷。 我只需要写这个方法,保存后我可以在我的testing套件中包含这个方法。 至于代码,我基本上只是检查testing对象中定义的方法,并确保它们不是testing对象的默认python“魔术”方法或属性。 之后,我可以假设他们是方法,可以评估。

我使用exec来创build一个Python插件系统。

    尝试:
         exec(“from”+ plugin_name +“导入插件”)
         myplugin =插件(module_options,config = config)
    除了ImportError,消息:
        致命(“没有这样的模块”+ plugin_name + \
                “(或没有插件构造函数)在我的Pythonpath:”+ str(message))
    例外:
        致命(“Module”+ plugin_name +“无法加载:”+ \
                str(sys.exc_type)+“:”+ str(sys.exc_value)+ \
                “\ n可能是一个缺失或错误的select?”)

有一个像这样的插件:

类插件:

     def __init__(self):
        通过

     def查询(self,arg):
          ...

你可以这样称呼它:

     result = myplugin.query(“something”)

我不认为你可以没有exec / eval Python插件。