代码之家  ›  专栏  ›  技术社区  ›  ooboo

在Python中使用eval?

  •  30
  • ooboo  · 技术社区  · 17 年前

    eval() 我在玩Python时偶然发现了这个函数。我想不出什么时候需要这个函数,除了作为句法糖。有人能举个例子吗?

    14 回复  |  直到 14 年前
        1
  •  51
  •   Alex Martelli    17 年前

    eval exec

    例如,如果我必须处理这样的动态Python源代码,我会选择 ast ast.literal_eval 评估 node = ast.parse(source) 首先,然后保持 node 大约,也许可以用合适的访问者来修改它,例如用于变量查找,然后 literal_eval 节点)——或者,一旦将节点设置为适当的形状并检查了安全问题,我就可以 compile 它(产生一个代码对象)并从中构建一个新的函数对象。远没有那么简单(除了 就是这么简单 评估 对于最简单的情况!)但在生产质量代码方面更安全、更可取。

    评估 getattr setattr globals() ,&c、 提供优选的、实际上通常更简单的解决方案。对于解析JSON等特定用途,库模块 json 更好(例如,见SilentGhost对耳鸣对这个问题的回答的评论)。等等。。。

        2
  •  16
  •   Noldorin    17 年前
        3
  •  13
  •   rob    17 年前

    您可能希望使用它来允许用户输入自己的“scriptlets”: 系统。

        4
  •  6
  •   Andre Miller    17 年前

    过去,我曾使用eval()为我的应用程序添加调试接口。我创建了一个telnet服务,它将您放入正在运行的应用程序的环境中。输入是通过eval()运行的,因此您可以在应用程序中交互式地运行Python命令。

        5
  •  5
  •   Stefano Borini    17 年前

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

    python解析器读取此输入文件,并使用eval()获得评估值和表达式的最终数据。

        6
  •  2
  •   tinnitus tinnitus    17 年前

    我将其用作快速JSON解析器。..

    r='''
    {
        "glossary": {
            "title": "example glossary"
            }
    }
    '''
    
    print eval(r)['glossary']['title']
    
        7
  •  2
  •   cmdLP    8 年前

    你可以在装饰器中使用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 ...
    

    @myModule.functionWithOneArg
    

    或函数调用:

    @functionReturningFunctionWithOneArg(any, "args")
    

    https://docs.python.org/3/reference/compound_stmts.html#function-definitions

        8
  •  1
  •   Zifre    17 年前

    eval() 通常不是很有用。我用过它的少数几件事之一(好吧,它是 exec() 实际上,它非常相似)允许用户编写我用Python编写的应用程序的脚本。如果它是用C++之类的语言编写的,我就必须在应用程序中嵌入Python解释器。

        9
  •  1
  •   Arnkrishn    17 年前

    例如:-

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

    干杯

        10
  •  1
  •   BBDXF    12 年前

    通常我们使用它们来添加或访问一些脚本,就像bashshell一样。

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

        11
  •  1
  •   Casey Craig    9 年前

    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“魔术”方法或test对象的属性。在那之后,我可以假设它们是方法,可以进行评估。

        12
  •  0
  •   buggy    12 年前

    test.py var1=2 var2=真

    ...

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

        13
  •  0
  •   N. Ahlers    5 年前

    我有一个案例,我将eval与informix数据库结合使用。出于某种原因,查询返回了一个如下形式的字符串

    query_result = "['1', '2', '3']"
    

    [int(i) for i in eval(query_result)]
    > [1,2,3]
    

    我无法更改db,所以这是一种快速(且肮脏)获取整数的方法。

        14
  •  -1
  •   bortzmeyer    17 年前

    我用 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")
    

    / eval .