获取“exec”调用中最后一个表达式的值

2024-03-19

假设我在字符串中有一些 python 代码

code = """
a = 42
a
"""

and I exec那串代码:

result = exec(code)

Then result一直会None。有没有办法获得最后一个表达式的值?在这种情况下,那就是5, since a是最后一个表情。

编辑:这是我所询问的功能的另一个示例。假设我们有 python 代码(存储在变量中code)

a = 100
sqrt(a)

那么我怎样才能以这样的方式执行代码来给出结果10- 那是,sqrt(a)?

编辑编辑:另一个例子:我希望的代码exec is

function_a()
function_b()
function_c()

有什么方法可以定义某种magic_exec函数使得

magic_exec(code)

将为我提供以下价值function_c()?


这个请求当然是有效的,因为我在创建基于Python的环境期间也需要这样的功能。我通过以下利用Python ast机制的代码解决了这个问题:

def my_exec(script, globals=None, locals=None):
    '''Execute a script and return the value of the last expression'''
    stmts = list(ast.iter_child_nodes(ast.parse(script)))
    if not stmts:
        return None
    if isinstance(stmts[-1], ast.Expr):
        # the last one is an expression and we will try to return the results
        # so we first execute the previous statements
        if len(stmts) > 1:
            exec(compile(ast.Module(body=stmts[:-1]), filename="<ast>", mode="exec"), globals, locals)
        # then we eval the last one
        return eval(compile(ast.Expression(body=stmts[-1].value), filename="<ast>", mode="eval"), globals, locals)
    else:
        # otherwise we just execute the entire code
        return exec(script, globals, locals)

代码应该是非常不言自明的,基本上就是这样

  1. 将脚本分成多个语句
  2. 如果最后一个是表达式,则将第一部分作为语句执行,最后一部分作为表达式执行。
  3. 否则将整个脚本作为语句执行。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

获取“exec”调用中最后一个表达式的值 的相关文章

随机推荐

  • ODP.NET 托管库确实可以解析别名,但 32 位库可以

    我的机器上安装了 32 位驱动程序 它们是由一些 DBA 安装和配置的 我编写了一个简单的脚本来测试驱动程序 大致如下 using DataTable table new DataTable using OracleConnection c
  • 我收到此错误“无模块:ngResource”

    尝试使用 Angular resource 但它返回的不是一种方法 浏览稀疏的文档 我发现了这一点 angular module productServices ngResource 您应该将其包含在您的应用程序模块中 公平地说 我把它放进
  • 如何根据定时器改变div的内容

    jquery 有没有办法根据计时器更改 div 的内容 假设我有提供 提示 的模块 提示内容应每 5 秒更改一次 Thanks 制定一系列提示 然后做一个interval5秒改变div的内容 我假设您想要随机提示 请参阅 jsFiddle
  • SVG 内的链接图像

    想象一下以下 SVG
  • Android NDK - NativeActivity 与 JNI 库

    两年前 我开发了一个增强现实框架android 7 闪电泡芙 http developer android com about versions android 2 1 html 由于 AR 应用程序是计算密集型任务 因此我开发了一个 JN
  • 我应该使用类还是字典?

    我有一个只包含字段而不包含方法的类 如下所示 class Request object def init self environ self environ environ self request method environ get R
  • 如何创建通用存储库?

    我想知道是否有人有关于制作通用存储库的任何好的教程 或者甚至可能是已经制作好的并且有详细记录的库 我当前正在使用 linq to sql 但它可能会发生变化 所以我不知道您是否可以创建一个通用存储库 如果我说切换到实体框架 则几乎不需要任何
  • 以编程方式展开/折叠 CoordinatorLayout 中的底部导航视图

    我有一个CoordinatorLayout其中包含一个BottomNavigationView and an AppBarLayout with a ToolBar在它里面 这BottomNavigationView不在里面AppBarLa
  • 部署不渲染 Kendo UI

    VS2012 asp net MVC4 c 带有 KendoUI 实现的互联网应用程序 最简单的说法是我的网站看起来像这样 开发机器上的本地 像这样部署 我检查了服务器 Kendo UI 论坛 所有论坛都指向图像丢失 我检查了甚至复制了我的
  • 授予 EC2 实例对 S3 存储桶的访问权限

    我想授予我的 ec2 实例对 s3 存储桶的访问权限 在此 ec2 实例上 启动了一个包含我的应用程序的容器 现在我没有获得 s3 存储桶的许可 这是我的存储桶政策 Version 2012 10 17 Id Policy146280822
  • 如何使用iPhone SDK下载文本文件?

    我是开发基于视图的 iPhone 应用程序的新手 我需要下载 这个 txt 文件来自互联网 并将其保存到应用程序的文档文件夹中 谁能简单地告诉我如何做到这一点 txt 文件很小 所以我不会 需要任何用户界面对象 Thanks Kevin N
  • 如何使用CSS仅在移动设备上显示文本?

    我有一个文本 在 div 中 显示在桌面和移动屏幕上 Expected 我希望文本仅显示在 media only screen and max width 768px How to 隐藏 div 与display none or 还有其他解
  • Django-rest-framework 多个 url 参数

    如何将 示例对象 映射到 url website com api
  • 编辑 PrimeNG 组件的 CSS

    我目前正在使用 Angular 4 Angular Materials 和 PrimeNG 组件开发用户界面 我正在处理的最新组件是来自 PrimeNG 的 MultiSelect 组件 https www primefaces org p
  • iOS 禁用横向 LaunchScreen.storyboard

    我有一个LaunchScreen storybaord显示徽标 文本 因此与方向无关 该应用程序始终以纵向启动 但它有某些允许横向模式的视图控制器 因此不能选择仅使应用程序纵向 我想要的是启动屏幕始终以纵向显示 因此 在应用程序启动期间将手
  • 通过模拟器发送电话号码

    我正在制作一个应用程序 我想检索设备电话号码并将其发送到服务器上 但我正在 Android 模拟器上测试这个应用程序 谁能告诉我如何在模拟器和实际设备中设置或获取电话号码 Thanks 如果我们使用电话管理器 我们可以在模拟器中获取电话号码
  • 如何在 Entity Framework Core 中删除多行? [复制]

    这个问题在这里已经有答案了 我需要使用 Entity Framework Core 从数据库中删除多行 此代码不起作用 foreach var item in items myCollection Remove item 因为我在第一个对象
  • 如何测试 Ruby on Rails 功能测试的 JSON 结果?

    我该如何维护我的Ajax http en wikipedia org wiki Ajax 28programming 29请求并测试 Ruby on Rails 功能测试的 JSON 输出 在 Rails gt 5 中 Use Action
  • Jena PrefixMapping:当模型是从数据集中获取的命名模型时,基本命名空间缺失

    这是我用来加载的代码OntModel to a Dataset作为命名模型 然后我尝试检索PrefixMapping以两种不同的方式实现相同的目的 public static void loadDatasetwithNamedModels
  • 获取“exec”调用中最后一个表达式的值

    假设我在字符串中有一些 python 代码 code a 42 a and I exec那串代码 result exec code Then result一直会None 有没有办法获得最后一个表达式的值 在这种情况下 那就是5 since