- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
为什么下面的python3代码会报错?
a='''
def x():
print(42)
'''
class Test:
def __init__(self):
exec(a)
x()
t = Test()
此消息中的结果:
Traceback (most recent call last):
File "bug.py", line 11, in <module>
t = Test()
File "bug.py", line 9, in __init__
x()
NameError: global name 'x' is not defined
最佳答案
注意:exec
在 Python 2.x 中只是一个简单的语句,而在 Python 3.x 中它是一个函数。
让我们检查通过执行 a
所做的更改。
class Test:
def __init__(self):
l, g = locals().copy(), globals().copy()
exec a # NOT a function call but a statement
print locals() == l, globals() == g
x()
t = Test()
输出
False True
42
这意味着,它改变了 locals
字典中的某些内容。如果你在 exec
之前和之后打印 locals().keys()
,你会看到 x
,在 exec
之后>。根据 exex 的文档,
In all cases, if the optional parts are omitted, the code is executed in the current scope.
因此,它完全按照文档中的说明进行操作。
当我们在 Python 3.x 中执行相同的操作时,我们会得到类似的结果,除了我们得到那个错误。
class Test:
def __init__(self):
l, g = locals().copy(), globals().copy()
exec(a) # Function call, NOT a statement
print(locals() == l, globals() == g)
x()
输出
False True
NameError: name 'x' is not defined
即使是 documentation of exec
function说,
In all cases, if the optional parts are omitted, the code is executed in the current scope.
但它还在底部包含一个注释,
Note: The default locals act as described for function
locals()
below: modifications to the default locals dictionary should not be attempted. Pass an explicit locals dictionary if you need to see effects of the code on locals after functionexec()
returns.
所以,我们好奇地检查了locals()
documentation并找到
Note: The contents of this dictionary should not be modified; changes may not affect the values of local and free variables used by the interpreter.
因此,解释器不支持对 locals()
对象所做的更改。这就是为什么它无法识别本地范围中定义的 x
。
但是当我们这样做时
def __init__(self):
exec(a, globals())
x()
它有效,因为我们将它添加到 globals
字典中。 Python 尝试首先在本地范围内查找 x
,然后在类范围内,然后在全局范围内查找,并在那里找到它。所以它执行它没有任何问题。
关于python - 在 Python 3 中使用在 exec'ed 字符串中定义的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24733831/
For 循环和多个变量和条件。 我正在使用 for 循环来设置源索引和目标索引以复制数组中的项目。 for(int src = 0, dst = 8; src = 0; src ++,
我正在尝试创建一个 2 面的 ggplot 对象,并将它们 grid.arrange 在两列中(grid.arrange 列)。在第二列中,在每个分面成员中,我想插入一个直方图。两列的数据源也不同。到
我正在使用 MS VS2010 和一个名为 Deleaker 的插件来发现我可能错过的任何内存泄漏。它告诉我 fopen_s 行有 2 处内存泄漏,但我没有在该行的任何内容上使用 new 或 mall
java.nio.charset.Charset.forName("utf8").decode解码 的字节序列 ED A0 80 ED B0 80 进入 Unicode 代码点: U+10000
我必须国际化 (i18n) 一个 Django 项目。它结合了许多内部 django 应用程序。它已经部分国际化了,即一些字符串是 _(),但有些是空的。一些模板使用 {% blocktrans %}
什么是EDS和 OD ?它们是如何创建和使用的? OD 是如何介于应用程序和 CAN 之间的?界面? 最佳答案 首先你应该读一点关于CANopen的内容熟悉这些概念。检查www.canopen.de您
我正在浏览 Wikipedia/Restrict , 并发现 The compiler can e.g. rearrange the code, first loading all memory lo
我正在 Linux 中编写一个 bourne shell 脚本,我正在使用 ed 将文本附加到文件的末尾。 我必须使用 ed 来完成这项任务。 我需要附加的文字看起来像这样 Modified on:
考虑以下 IL 代码: .method public static void Main() { ldstr "Starts Here" call voi
我有这样的东西: //html Action 1 Action 1 Action 1 ...
考虑使用 malloc 定义的 (char *) 变量 sTmp, 如果我将另一个变量分配给此 sTmp,通过该变量分配的内存是否会自动释放,或者该内存块是否会保持分配(且无用)直到进程结束? 让我用
我定义了一个不透明的结构和相关的 API,如下所示: typedef struct foo foo; foo *create_foo(...); delete_foo(foo *f); 我无法在我的
使用以下伪 Python 脚本将数据发送到本地套接字: s = socket.socket(AF_UNIX, SOCK_STREAM) s.connect("./sock.sock") s.send(
我有一个正方形比例的MKMapView mainMap,它的宽度等于iPhone屏幕宽度。我使用以下方法将其设为圆形: mainMap.layer.cornerRadius = mainMap.fra
假设您要对所有包含模式的文件进行编辑。例如,将所有“2017”更改为“2018”。存在许多针对 perl、sed 和各种其他的建议。如果 ed 编辑器可以工作的话,它会简单得多。 给定一个文件: $
我在 bash 脚本中使用 ed 来搜索文件; / 命令将显示我不想要的内容。我尝试重定向 >/dev/null 2>&1 但这对我不起作用。 文本文件foo.txt: a b c bash 脚本ba
我正在研究 ed 文本编辑器。 要退出输入模式,用户应输入一个句点 (.)。 假设我想以文本形式输入句点。 我想到了一个解决方法:首先,我插入类似.. 的内容。然后,我将 .. 替换为 .. 但我的方
Rust playground : trait FnBox { fn call_box(self: Box); } impl FnBox for F { fn call_box(sel
我们有多个域指向我们的 Tomcat Web 应用程序,它们都由我们的默认 Host 提供服务: 我需要配置哪个 Valve 模式来查看请求已发送到哪个域(即用户在网络浏览器中输入了哪
我做了一个简单的test(jsbin)与: {a:1} //dummy value var a=1; 然后: alert($("#a").text()); 结果是: 但是 - 使用
我是一名优秀的程序员,十分优秀!