在Python中使用eval?在Python中使用eval?(Use of eval in Pyth

2019-05-17 00:18发布

有一个eval() Python函数中,我偶然发现而玩弄。 当需要这种功能,也许除了作为语法糖我不能想到一个情况。 谁能举个例子?

Answer 1:

evalexec都得心应手快速和肮脏的方式来动态地获取一些源代码,也许Munge时间这一点,然后执行它-但他们几乎没有最好的方式,尤其是在生产代码,而不是“单触和肮脏的”原型&C。

举例来说,如果我有对付这种动态的Python源,我端起AST模块- ast.literal_eval是远远超过安全eval (你可以直接调用它表达的字符串形式,如果它是一个-off并依赖于简单的常量,或者仅做node = ast.parse(source) ,然后再保持node周围,也许Munge时间将其与合适的访问者例如用于变量查找,然后literal_eval节点) -或,一旦已经把在适当的形状节点和审核它的安全问题,我可以compile它(得到代码对象),并建立一个新的函数对象了这一点。 远不如简单的(除了ast.literal_eval是一样简单eval为最简单的情况!),但安全生产质量的代码和优选。

对于许多任务,我见过的人(AB-)使用execeval的,Python的功能强大的内置插件,如getattrsetattr ,索引到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



文章来源: Use of eval in Python?