我在整理项目中的作用域错误时遇到了严重的问题。 我的项目看起来像这样:
有一个包含进程的主文件,它用tkinter创建gui
interfaceAndProcess.pyw
import lib1
...
#do something with tkinter
filePath = askopenfilename(filetypes=(("All files", "*.*")))
...
lib1.checkSomeDocument(filePath)
然后我有一个“所有lib的母亲”,其他lib从中获取函数。你知道吗
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"
我的问题是接口进程.pyw在lib1调用函数parseSomething(lookForStringX)的行上抛出NameError,表示“name'line'未定义”。你知道吗
为什么parseSomething
看不到var line
?你知道吗
当我把parseSomething
放进文件moalibs.py
时,一切都正常。你知道吗
我很抱歉这个问题非常具体,但我正在搜索和尝试两个多小时了。
在方法内部玩global line
,在方法内部定义line
接口进程.pyw,没什么。。。你知道吗
有什么建议吗?你知道吗
编辑: 好吧,我明白我所尝试的并不能像我预期的那样奏效。 如何在不将变量作为参数传递的情况下实现这一点?你知道吗
对于初学者来说,
global
关键字对已经在顶级命名空间中的变量没有任何作用(在本例中是line
)。This Stack Overflow question讨论了原因。你知道吗出现NameError的原因是
lib1.py
导入了moalibs.py
的命名空间,反之亦然。您在lib1.py
中使line
全局化,但moalibs.py
不导入lib1.py
。你知道吗要理解我的意思,可以使用^{} 函数让每个模块告诉您其当前名称空间内容。您会发现lib1.py完全了解moalibs.py公司的标识符,但是moalibs.py公司不知道lib1.py的标识符。你知道吗
相关问题 更多 >
编程相关推荐