我在解决项目中的范围界定错误时遇到了严重的困难。 我的项目看起来像这样:
这个主文件包含进程并使用 tkinter 创建 GUI
interfaceAndProcess.pyw
import lib1
...
#do something with tkinter
filePath = askopenfilename(filetypes=(("All files", "*.*")))
...
lib1.checkSomeDocument(filePath)
然后我有一个“motherOfAllLlibs”,其他库从中获取函数。
moalibs.py
def parseSomething(lookForStringX)
position = line.index(lookForStringX, 0)
return(position)
def bla():
...
def blabla():
...
这是使用 moalibs.py 中的方法的众多库之一
lib1.py
from moalibs import *
def checkSomeDocument(filePath)
global line
fileContent = open(filePath, 'r')
for line in fileContent:
tmpVar = parseSomething(lookForStringX)
...
tmpVar = bla()
...
tmpVar = blabla()
...
tmpVar = bla()
# In any of my many libs the methods from moalib are called
# serveral times in different orders, that's why this part
# is pretty "hard coded"
我的问题是,interfaceAndProcess.pyw 的执行在 lib1 调用函数 parseSomething(lookForStringX) 的行上抛出一个 NameError ,说“名称'行'未定义”。
为什么看不到 var
parseSomething
?当我将 line
放入文件中时
parseSomething
一切正常。我很抱歉这个问题非常具体,但我现在正在搜索和尝试两个多小时。
一直在方法中使用 moalibs.py
,在 interfaceAndProcess.pyw 中定义
global line
,什么都没有...有什么建议吗?
编辑: 好吧,我明白我所尝试的并不能按我的预期工作。 在不将变量作为参数传递的情况下,我如何实现这一目标?
line
关键字对顶级命名空间中已经存在的变量没有任何作用(在本例中是
global
)。 这个 Stack Overflow 问题讨论了原因。 您收到 NameError 的原因是因为
line
导入了
lib1.py
的命名空间,反之亦然。您在 moalibs.py
中将 line
设为全局,但 lib1.py
不导入 moalibs.py
。 要明白我的意思,您可以使用
函数要求每个模块告诉您其当前的命名空间内容。你会发现 lib1.py 完全知道 moalibs.py 的所有标识符,但是 moalibs.py 不知道 lib1.py 的标识符。