gpt4 book ai didi

Python __import__ 参数混淆

转载 作者:太空狗 更新时间:2023-10-29 21:30:06 26 4
gpt4 key购买 nike

我正在尝试导入一个模块,同时传递一些全局变量,但它似乎不起作用:

文件 test_1:

test_2 = __import__("test_2", {"testvar": 1})

文件 test_2:

print testvar

这看起来应该可以工作,并打印 1,但是当我运行 test_1 时出现以下错误:

Traceback (most recent call last):
File ".../test_1.py", line 1, in <module>
print testvar
NameError: name 'testvar' is not defined

我做错了什么?

编辑:

正如我稍后评论的那样,这是在图形库中替换函数的尝试。这是一个使用该库的示例程序(我的老师编写的):

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)

请注意,此代码的设计使得以前从未(或几乎从未)看过任何代码(不仅仅是 python)的人能够轻松理解。

重写函数的例子:

原代码:

def drawPoint(x, y, color=GLI.foreground):
GLI.screen.set_at((int(x),int(y)), lookupColor(color))

注入(inject)代码:

# 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))

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

最佳答案

作为the docs解释一下,__import__globals 参数确实将额外的全局变量“注入(inject)”到导入的模块中,正如您似乎相信的那样——事实上,什么是通常传递的是 importing 模块的 globals(),因此如果发生这种注入(inject)将是非常有问题的。事实上,__import__ 的文档明确指出:

The standard implementation does not use its locals argument at all, and uses its globals only to determine the package context of the import statement.

编辑:如果您确实需要注入(inject),例如进入一个空的导入模块,正如 OP 在评论中所建议的那样,只要您可以立即导入,这很容易:

themod = __import__(themodname)
themod.__dict__.update(thedict)

导入模块的主体将不会意识到仍将发生的注入(inject),但很明显,无论所述主体是否为空,这都是无关紧要的;-)。在导入之后,您可以随意注入(inject),该模块的所有后续使用都会将您的注入(inject)视为真正的模块级绑定(bind)名称(因为它们;-).

如果您愿意,您甚至可以省去空 .py 模块的需求...:

import new, sys
themod = new.module(themodname)
sys.modules[themodname] = themod
themod.__dict__.update(thedict)

编辑:OP 试图在 Q 的编辑中澄清...:

I guess my real question is: how would I inject global functions/variables into an imported module before the module runs...?

“模块运行”没有多大意义——模块被加载(执行它们的主体),只加载一次(除非稍后显式地重新加载)......它们从不“运行” “本身。给定一个空模块,您首先导入它(因为模块是空的,所以什么都不执行),然后如果您愿意,可以混合使用 themodule.__dict__.update 和属性赋值来填充模块——刚刚提到的函数不会自动调用(因为 OP 表示担心它们会出现在评论中),因此在这方面可以像对待任何其他变量一样对待它们(以及大多数其他变量,这就是为什么据说 Python 具有一流 功能)。

关于Python __import__ 参数混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2939854/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com