- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
python 文档指出“execfile() 不能可靠地用于修改函数的局部变量。”在页面上http://docs.python.org/2/library/functions.html#execfile
任何人都可以提供有关此声明的更多详细信息吗?文档相当少。该语句似乎与“如果两个字典都被省略,则表达式在调用execfile()的环境中执行”非常矛盾。这也在文档中。如果在函数中使用 excecfile,然后 execfile 的行为类似于创建新范围级别的函数,是否存在特殊情况?
如果我在函数中使用 execfile,例如
def testfun():
execfile('thefile.py',globals())
def testfun2():
print a
还有'thefile.py'中的命令创建的对象(例如对象'a'),我怎么知道它们是testfun的局部对象还是全局对象?那么,在函数 testfun2 中,'a' 看起来是全局的?如果我从 execfile 语句中省略 globals(),谁能给出更详细的解释,为什么“thefile.py”中的命令创建的对象对“testfun”不可用?
最佳答案
在 Python 中,查找名称的方式在函数内部进行了高度优化。其中一个副作用是 locals()
返回的映射为您提供了函数内部局部名称的副本,并且更改该映射实际上不会影响函数:
def foo():
a = 'spam'
locals()['a'] = 'ham'
print(a) # prints 'spam'
在内部,Python 使用LOAD_FAST
操作码按索引 在当前帧中查找a
名称,而不是较慢的LOAD_NAME
,它将查找本地名称(按名称),如果在第一个中找不到,则在 globals()
映射中查找。
Python 编译器只能为在编译时 已知的本地名称发出LOAD_FAST
操作码;但是如果您允许 locals()
直接影响函数的局部变量,那么您就无法提前知道所有局部名称。使用作用域名称(自由变量)的嵌套函数使事情变得更加复杂。
在 Python 2 中,您可以通过在函数中使用 exec
语句强制编译器关闭优化并始终使用 LOAD_NAME
:
def foo():
a = 'spam'
exec 'a == a' # a noop, but just the presence of `exec` is important
locals()['a'] = 'ham'
print(a) # prints 'ham'
在 Python 3 中,exec
已被 exec()
取代,解决方法也已消失。在 Python 3 中,所有 函数都得到了优化。
如果您没有遵循所有这些,那也没关系,但这就是文档稍微掩盖这一点的原因。这都是由于大多数 Python 用户不需要了解的 CPython 编译器和解释器的实现细节;您只需要知道,使用 locals()
更改函数中的本地名称通常是行不通的。
关于python - execfile() 不能可靠地用于修改函数的局部变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16065468/
我遇到了问题,甚至不确定从哪里开始进行故障排除。 我正在使用 slightly modified mocha-casperjs . CasperJS 是 PhantomJS 的包装器。我正在尝试在测试
我想在我的 GUI 中有一个文本框和一个按钮,单击按钮时,它应该获取文本并将其存储在其他文件的变量中,然后运行其他文件。 我希望用户输入访问 token ,GUI 应将其保存在utilities.py
python 文档指出“execfile() 不能可靠地用于修改函数的局部变量。”在页面上http://docs.python.org/2/library/functions.html#execfil
我正在尝试使用 Tkinter 为我的 Python 程序制作一个启动器。我使用了 execfile 函数,幸运的是它打开了目标 GUI。但是,所有按钮都不起作用,它会说大多数函数引用的全局变量未定义
我的结构是这样的: c |-myMain.py |-.....\someDir |-startup.py |-subDir
我有这个功能: #This function loads the tokens for the specified account. If the tokens are not found, it q
标题中提出的问题可能是the XY-Problem的情况, 但我找不到更简洁的描述。我想通过在每个脚本上运行 execfile(filename) 来测试一些 python 脚本,然后查看它们是否触发
我正在尝试将信息加载到用户定义的函数中以供进一步处理。由于输入文件必须由非程序员生成,因此我选择了以下格式: #contents of vessel_data.txt hull_length = 10
我遇到的问题与 this question 中的第一个问题类似,据我所知没有得到答复。 我有一个文件“config.py”,其中包含一个类要使用的大量参数(这个 config.py 文件会更改),但是
是否可以在不使用 if/else 语句的情况下中断使用 execfile 函数调用的 Python 脚本的执行?我试过 exit(),但它不允许 main.py 完成。 # main.py print
我在 ipython shell 内部工作,经常需要重新加载包含正在构建的函数的脚本文件。 在我的 main.py 中我有: def myreload(): execfile("main.py") e
我有一个运行多个 python 代码的代码,如下所示: execfile("1.py") execfile("2.py") execfile("3.py") 但是偶尔上述代码之一会出现错误,我会将 e
我尝试执行 *.exe 文件,但得到: 执行错误:{ 错误:spawn ${__dirname}/install.exe ENOENT 代码: var execFile = require('chil
我正在尝试从用户那里获取文件名,然后使用 execfile() 来执行该文件。下面是我的代码: print "Please enter the name of the file" filename =
我有一个包含序言信息的 config.py 脚本。我可以使用 execfile() 函数来读取配置文件的内容。 execfile("config.py") print PREAMBLE >>> "AB
我正在尝试使用他们的二进制文件连接到 browserstack 并将我的 key 作为参数传递。如果我在终端窗口中执行此操作: ./BrowserStackLocal --key ${BROWSERS
我把一个方法放在文件 mymodule.py 中: def do_something(): global a a=1 如果我尝试 >>> execfile('mymodule.py')
在我的一些 Django 应用程序中,我使用 settings_local.py 文件来覆盖在不同环境(例如开发、测试和生产)中不同的设置。我最初使用以下代码将其内容包含在 settings.py 中
我有一个 Node 脚本,它以这种方式调用外部程序 (PluginManager.exe): const util = require('util'); const execFile = util.p
我使用child_process通过phantomjs执行yslow.js。示例(CLI): phantomjs yslow.js --info all --format json url 我们可以
我是一名优秀的程序员,十分优秀!