Python 中 eval 的使用

2025-03-07 08:59:00
admin
原创
34
摘要:问题描述:我在玩 Python 时偶然发现了一个eval()函数。我想不出需要这个函数的情况,除非作为语法糖。有什么例子吗?解决方案 1:eval并且exec是快速而简便的方法来动态获取一些源代码,可能稍微处理一下,然后执行它 - 但它们几乎从来都不是最好的方法,特别是在生产代码中,而不是“快速而肮脏”的原型...

问题描述:

我在玩 Python 时偶然发现了一个eval()函数。我想不出需要这个函数的情况,除非作为语法糖。有什么例子吗?


解决方案 1:

eval并且exec是快速而简便的方法来动态获取一些源代码,可能稍微处理一下,然后执行它 - 但它们几乎从来都不是最好的方法,特别是在生产代码中,而不是“快速而肮脏”的原型等。

例如,如果我必须处理这样的动态 Python 源,我会使用ast模块 -ast.literal_evaleval(您可以直接在表达式的字符串形式上调用它,如果它是一次性的并且仅依赖于简单常量,或者node = ast.parse(source)先执行,然后保留node它,也许用合适的访问者对其进行混合,例如用于变量查找,然后是literal_eval节点) - 或者,一旦将节点置于适当的形状并对其进行安全问题审查,我就可以compile(产生一个代码对象)并从中构建一个新的函数对象。远没有那么简单(除了它和最简单的情况ast.literal_eval一样简单eval!)但在生产质量代码中更安全且更可取。

对于许多任务,我见过人们(滥用)使用execeval,Python 强大的内置功能(例如getattrsetattr、索引globals()等)提供了更好的解决方案,而且实际上通常更简单。对于解析 JSON 等特定用途,库模块json(例如,请参阅 SilentGhost 对耳鸣对这个问题的回答的评论)更好。等等,等等……

解决方案 2:

维基百科的文章eval非常有帮助,详细介绍了各种用途。

它建议的一些用途包括:

  • 评估数学表达式

  • 编译器引导

  • 脚本(一般来说动态语言非常适合)

  • 语言导师

解决方案 3:

您可能希望使用它来允许用户输入自己的“脚本”:表达式(甚至是小函数),可用于自定义复杂系统的行为。

在这种情况下,如果您不必太在意安全隐患(例如,您拥有受过教育的用户群),那么 eval() 可能是一个不错的选择。

解决方案 4:

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

解决方案 5:

在我曾经编写的一个程序中,有一个输入文件,您可以在其中将几何参数指定为值,也可以指定为先前值的 python 表达式,例如:

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

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

我不敢说这是好的编程,但我不需要驾驶核反应堆。

解决方案 6:

我将它用作快速 JSON 解析器......

r='''
{
    "glossary": {
        "title": "example glossary"
        }
}
'''

print eval(r)['glossary']['title']

解决方案 7:

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

解决方案 8:

eval()通常不是很有用。我使用它的少数几个用途之一(嗯,exec()实际上它有用,但非常相似)是允许用户编写我用 Python 编写的应用程序脚本。如果它是用 C++ 之类的东西编写的,我必须在应用程序中嵌入 Python 解释器。

解决方案 9:

Eval 是一种在程序内部与 Python 解释器交互的方法。您可以将文字传递给 eval,它会将其作为 Python 表达式进行求值。

例如 -

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

将返回当前工作目录。

干杯

解决方案 10:

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

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

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

解决方案 11:

我刚刚发现了 eval 的一个好用法。我正在为一些代码编写测试套件,并创建了一个 Test 类,其中每个方法都是要运行的测试。我想要一种方法,这样我就可以运行所有测试方法,而不必单独调用每个方法。所以,我写了一些相当肮脏的东西。

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“魔法”方法或属性。之后,我可以假设它们是方法并且可以进行评估。

解决方案 12:

我用它将变量值输入到主程序中:

测试.py var1=2 var2=True

...

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

在主程序中允许关键字参数的粗略方法。如果有更好的方法请告诉我!

解决方案 13:

我曾经使用过 eval 与 informix 数据库。由于某种原因,查询返回了如下形式的字符串

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

我只是在查询结果上使用了 eval,所以 python 将其解释为字符串列表。

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

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

解决方案 14:

我使用execPython 创建一个插件系统。

    尝试:
        exec ("从 " + 插件名称 + " 导入插件")
        myplugin = 插件(module_options,config=config)
    除了 ImportError,消息:
        致命(“没有这样的模块”+插件名称+\n               “(或者我的 Python 路径中没有插件构造函数):” + str(message))
    except 例外:
        致命(“模块”+plugin_name+“无法加载:”+\n               str(系统.exc_type) + “: “ + str(系统.exc_value) + \n               “.
 可能是缺失或者错误的选项?”)

使用如下插件:

插件类:

    def __init__ (自身):
        经过

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

你可以像这样调用它:

    结果 = myplugin.query(“某事”)

exec我认为如果没有/就不能在 Python 中拥有插件eval

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1887  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1425  
  在制造业数字化转型的进程中,PLM(产品生命周期管理)系统、ERP(企业资源计划)系统、MES(制造执行系统)以及 CAD(计算机辅助设计)软件都扮演着至关重要的角色。然而,这些系统和软件各自独立运行时,往往难以发挥出最大的协同效应。实现 PLM 系统与 ERP、MES、CAD 的有效集成,成为提升企业整体竞争力、优化...
plm系统的主要功能模块   3  
  产品生命周期管理(PLM)作为一种先进的管理理念和技术,在电子与半导体行业正发挥着日益重要的作用。随着电子与半导体行业的快速发展,产品更新换代速度加快,市场竞争愈发激烈,企业面临着诸多挑战,如缩短产品上市时间、提高产品质量、降低成本等。而PLM的应用为企业应对这些挑战提供了有效的解决方案,展现出巨大的应用价值。提升产品...
plm项目   4  
  PLM(产品生命周期管理)项目管理软件在现代企业的产品研发、生产与运营中扮演着至关重要的角色。它整合了从产品概念设计到退役的全流程数据与流程,助力企业提升效率、降低成本并增强创新能力。随着科技的飞速发展以及企业需求的不断演变,未来十年 PLM 项目管理软件的发展充满了无限可能,值得深入探讨与预测。智能化与自动化趋势智能...
plm产品全生命周期管理   6  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用