Python __import__参数混乱

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)

我想我真正的问题是:在模块运行之前,如何将全局函数/变量注入导入的模块中?

Ale*_*lli 7

由于该文档说明,该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说具有一流的功能).


Kay*_*rix 3

我面临着同样的问题......我用以下技术说服了自己......我不知道这对你有用或没有用!

文件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 并且也是通过引用传递的。