Python 2 与 3 中的 Eval 范围

2023-12-19

我在 Python 3 中遇到了奇怪的 eval 行为 - 当在列表理解中调用 eval 时,不会拾取局部变量。

def apply_op():
    x, y, z = [0.5, 0.25, 0.75]
    op = "x,y,z"
    return [eval(o) for o in op.split(",")]
print(apply_op())

Python 3 中出现错误:

▶ python --version
Python 3.4.3
▶ python eval.py
Traceback (most recent call last):
  File "eval.py", line 7, in <module>
    print(apply_op())
  File "eval.py", line 5, in apply_op
    return [eval(o) % 1 for o in op.split(",")]
  File "eval.py", line 5, in <listcomp>
    return [eval(o) % 1 for o in op.split(",")]
  File "<string>", line 1, in <module>
NameError: name 'x' is not defined

它在 Python 2 中运行良好:

▶ python --version
Python 2.7.8
▶ python eval.py
[0.5, 0.25, 0.75]

将其移到列表理解之外可以消除该问题。

def apply_op():
    x, y, z = [0.5, 0.25, 0.75]
    return [eval("x"), eval("y"), eval("z")]

这是预期的行为,还是一个错误?


有一个closed错误跟踪器中的问题:问题 5242 http://bugs.python.org/issue5242.

该错误的解决方案是不会修复.

该问题的一些评论如下:

这是预料之中的,并且不会轻易修复。原因就在于这份名单 3.x 中的推导式使用“幕后”函数命名空间(在 2.x 中, 它们的实现就像一个简单的 for 循环)。因为内部函数 需要知道从封闭的命名空间中获取什么名称,名称 eval() 中引用的内容不能来自封闭函数。他们一定 要么是本地人,要么是全球人。

eval() 可能已经是一个 hack,不需要添加另一个 hack 使其发挥作用。最好摆脱 eval() 并找到更好的 做你想做的事情的方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 2 与 3 中的 Eval 范围 的相关文章

随机推荐

  • PowerShell:更改文件夹或文件的时间戳(创建日期)

    对于 Windows 10 上的 PowerShell 命令 我遇到了奇怪的行为 要更改文件的创建日期 我使用 Get ChildItem C testFile1 txt CreationTime 01 11 2005 06 00 36 要
  • jQuery/原型冲突

    我正在使用 jQuery hoverIntent js 脚本来构建大型下拉菜单系统 其灵感来自于 Son Tonaka 的大型下拉菜单 w CSS 和 jQuery sohtanaka com web design mega drop do
  • List 抛出 ConcurrentModificationException 但 set 不抛出 ConcurrentModificationException? [复制]

    这个问题在这里已经有答案了 我有以下两个java类 import java util public class ArrayListTest032 public static void main String ar List
  • 防止网页抓取

    我目前是开发一个应用程序的团队的一员 该应用程序包括前端客户端 通过这个客户端 我们发送用户数据 每个用户都有一个用户 ID 客户端通过 RESTful API 与我们的服务器对话 向服务器请求数据 例如 假设我们有一个书籍数据库 用户可以
  • 将部分模式从 sed 传递到 shell

    我有一个文件 其中包含以下格式的行 w1 1 x w2 4 b w3 2 d 该行中的每个单词 标记 例如 w1 1 x 由 3 部分组成 第一个部分显示某个索引 本例中为 w1 第二个是整数 本例中为 1 第三个是一个字符 在本例中为 x
  • 使用背景颜色在 UIDatePicker 上设置角半径

    我有一个UIDatePicker在我看来 并设置了背景颜色UIDatePicker self datePicker backgroundColor UIColor lightTextColor self datePicker layer c
  • php:将 ntlm 凭据转发给curl

    我有一个动态 php 页面 我需要使用 get 参数来调用它 然后我想将生成的 html 放入一个字符串中并稍后使用它 我正在尝试用于 Web 服务的 tonic 框架 所以这类似于PHP 将动态生成 和回显 的 HTML 读取到字符串中
  • PHP 重定向与自定义标头

    我正在编写一个基本的授权系统 但我有点挣扎 涉及两个文件 index php and login php 登录表单非常简单 它在里面index php fieldset class right fieldset
  • 服务器控件如何违反 MVC 设计模式?

    我问的原因是 tvanfosson 对他对另一个问题的回答的 第一个 评论我的问题 https stackoverflow com questions 3689236 what are the key concepts to know wh
  • 相同的匿名结构是否兼容?

    考虑这个代码片段 include
  • github 是否允许预接收挂钩?

    GitHub 是否允许预接收或更新挂钩 我想要做的是防止主分支被推送到 即 master hotfix develop 并要求通过 GitHub 拉取请求合并它们 这是一个私人存储库 因此 GitHub 风格的分叉不是一个选择 任何有关如何
  • 从 BLOB mysql python 写入文件

    我正在尝试从数据库获取文件并将其写入磁盘 该文件存储为 BLOB 现在我有以下代码 usr bin python import MySQLdb db2 MySQLdb connect host localhost user root pas
  • Tensorflow ValueError:仅使用命名参数调用“sparse_softmax_cross_entropy_with_logits”(标签=...,logits=...,...)

    上述错误是由传统代码引起的 tf nn sigmoid cross entropy with logits self D logits tf ones like self D 使用 Tensorflow V1 0 或更高版本时会发生这种情况
  • 将一长逗号字符串拆分为多列新表

    我是 SQL 的犹太教徒 请原谅我的无知 我有一张名为 temp 的表 其中包含一个带有一个长逗号分隔字符串的字段 因此 Field1 Apples oranges pears berries melons 我想将上述内容插入到具有预定义列
  • 抑制生成的 C# 代码的警告

    我已经为我的 VS 项目打开了 将警告视为错误 这意味着我会收到缺少文档的错误 对于这个特定项目来说是一个很好的提醒 但是 部分代码是由自定义工具生成的 该工具不会插入 xml 文档 因此我希望仅忽略生成的代码 而不是整个项目 缺少的 xm
  • AttributeError:“模型”对象没有属性“predict_classes”

    我正在尝试使用预先训练和微调的深度学习模型来预测验证数据 该代码遵循 Keras 博客中 使用很少的数据构建图像分类模型 中提供的示例 这是代码 import numpy as np from keras preprocessing ima
  • 这是因为互斥量没有释放吗?

    我读过这个将我们的单线程服务器变成多线程服务器 https doc rust lang org book ch20 02 multithreaded html 并试图去实施它 我写了这个 use std sync mpsc channel
  • 如何 git tag 所有子模块?

    我想标记我的项目的所有子模块 我尝试这样做 git submodule foreach git tag tagName 但它似乎只是返回而没有错误 什么也没做 编辑 这是我尝试的结果 有人可以告诉我如何正确标记所有子模块吗 注意 这是一个非
  • 以小于帧大小的增量分页 UIScrollView

    我有一个滚动视图 其宽度与屏幕相同 但高度只有约 70 像素 它包含许多 50 x 50 的图标 周围有空间 我希望用户能够从中进行选择 但我总是希望滚动视图以分页方式运行 始终以图标停止在正中心 如果图标是屏幕的宽度 这不会成为问题 因为
  • Python 2 与 3 中的 Eval 范围

    我在 Python 3 中遇到了奇怪的 eval 行为 当在列表理解中调用 eval 时 不会拾取局部变量 def apply op x y z 0 5 0 25 0 75 op x y z return eval o for o in o