ske*_*gse 7 python import global
我正在尝试导入一个模块,同时传递一些全局变量,但它似乎不起作用:
文件test_1:
test_2 = __import__("test_2", {"testvar": 1})
Run Code Online (Sandbox Code Playgroud)
文件test_2:
print testvar
Run Code Online (Sandbox Code Playgroud)
这似乎应该工作,并打印1,但我运行test_1时出现以下错误:
Traceback (most recent call last):
File ".../test_1.py", line 1, in <module>
print testvar
NameError: name 'testvar' is not defined
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
编辑:
正如我稍后评论的那样,这是尝试替换图形库中的函数.这是一个使用该库的示例程序(我的老师写的):
from graphics import *
makeGraphicsWindow(800, 600)
############################################################
# this function is called once to initialize your new world
def startWorld(world):
world.ballX = 50
world.ballY = 300
return world
############################################################
# this function is called every frame to update your world
def updateWorld(world):
world.ballX = world.ballX + 3
return world
############################################################
# this function is called every frame to draw your world
def drawWorld(world):
fillCircle(world.ballX, world.ballY, 50, "red")
############################################################
runGraphics(startWorld, updateWorld, drawWorld)
Run Code Online (Sandbox Code Playgroud)
请注意,此代码的设计使得之前(或几乎从未)看过任何代码的人(不仅仅是python)能够轻松理解.
重写函数的示例:
原始代码:
def drawPoint(x, y, color=GLI.foreground):
GLI.screen.set_at((int(x),int(y)), lookupColor(color))
Run Code Online (Sandbox Code Playgroud)
注入的代码:
# Where self is a window (class I created) instance.
def drawPoint(x, y, color = self.foreground):
self.surface.set_at((int(x), int(y)), lookupColor(color))
Run Code Online (Sandbox Code Playgroud)
我想我真正的问题是:在模块运行之前,如何将全局函数/变量注入导入的模块中?
由于该文档说明,该globals参数__import__并不能 "注入"额外全局到导入的模块,你似乎认为-实际上,什么是正常传递存在globals()的的输入模块,所以这种注射是,如果它发生了很大的问题.的确,__import__博士特别说:
标准实现根本不使用其locals参数,并仅使用其全局变量来确定import语句的包上下文.
编辑:如果你确实需要注入,例如进入一个空的导入模块,就像评论中提出的OP一样,只要你在导入后立即执行它就很容易:
themod = __import__(themodname)
themod.__dict__.update(thedict)
Run Code Online (Sandbox Code Playgroud)
进口模块的主体不会注意到仍然发生的注射,但无论如何,无论这个身体是否为空,这显然都是空的;-).右后导入,你可以注入到你的心脏的内容,以下所有该模块的用途将看到你打针,好像他们是真正的模块级约束的名字(因为它们是 ;-).
如果你愿意,你甚至可以节省空.py模块的开头......:
import new, sys
themod = new.module(themodname)
sys.modules[themodname] = themod
themod.__dict__.update(thedict)
Run Code Online (Sandbox Code Playgroud)
编辑:OP试图澄清Q ...的编辑:
我想我真正的问题是:在模块运行之前,如何将全局函数/变量注入导入的模块中?
"模块运行"没有多大意义 - 模块被加载(执行它们的主体),只需一次(除非稍后明确重新加载)......它们本身从不"运行".给定一个空模块,首先导入它(由于模块为空,它不执行任何操作),然后你可以使用混合themodule.__dict__.update和属性赋值来填充模块 - 刚才提到的函数不会被自动调用(作为OP表示担心他们会在评论中),所以他们可以被视为在这方面的任何其他变量(和大多数其他变量,这就是为什么Python说具有一流的功能).
我面临着同样的问题......我用以下技术说服了自己......我不知道这对你有用或没有用!
文件2:测试1.py
global myvar
myvar = "some initial value"
print myvar
test = __import__("test2")
print myvar
Run Code Online (Sandbox Code Playgroud)
文件2:test2.py
import inspect
stk = inspect.stack()[1]
myvar = inspect.getmodule(frm[0]).myvar
print myvar
myvar = "i am changing its value."
Run Code Online (Sandbox Code Playgroud)
这里变量从 module1 传递到 module2 并且也是通过引用传递的。
| 归档时间: |
|
| 查看次数: |
4864 次 |
| 最近记录: |