几乎嵌套项目中的NameError

时间:2017-04-19 22:01:10

标签: python scope nameerror

我在整理项目中的范围错误时遇到了严重问题。 我的项目看起来像这样:

这个主文件包含进程并使用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,没有...

有什么建议吗?

编辑: 好吧,我明白我试过的东西不能像我预期的那样工作。 如果不将变量作为参数传递,我将如何实现这一目标?

1 个答案:

答案 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的标识符。