我在整理项目中的范围错误时遇到了严重问题。 我的项目看起来像这样:
这个主文件包含进程并使用tkinter创建gui
interfaceAndProcess.pyw
import lib1
...
#do something with tkinter
filePath = askopenfilename(filetypes=(("All files", "*.*")))
...
lib1.checkSomeDocument(filePath)
然后我有一个“motherOfAllLlibs”,其他libs从中获取函数。
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,说明“name'line'未定义”。
为什么parseSomething
无法看到var line
?
当我将parseSomething
放入文件moalibs.py
时,everthing工作正常。
我很抱歉这个问题非常具体,但我现在正在搜索和尝试两个多小时。
在方法中使用global line
,在interfaceAndProcess.pyw中定义line
,没有...
有什么建议吗?
编辑: 好吧,我明白我试过的东西不能像我预期的那样工作。 如果不将变量作为参数传递,我将如何实现这一目标?
答案 0 :(得分:0)
首先,global
关键字不对顶级命名空间中已存在的变量执行任何操作(在本例中为line
)。 This Stack Overflow question讨论了原因。
您获得NameError的原因是lib1.py
导入moalibs.py
的命名空间,反之亦然。您在line
中将lib1.py
设为全局,但moalibs.py
并未导入lib1.py
。
要了解我的意思,您可以让每个模块使用dir()
函数告诉您当前的命名空间内容。您会发现lib1.py完全了解所有moalibs.py的标识符,但moalibs.py不知道lib1.py的标识符。