几乎嵌套项目中的名称错误

问题描述 投票:0回答:1

我在解决项目中的范围界定错误时遇到了严重的困难。 我的项目看起来像这样:

这个主文件包含进程并使用 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
,什么都没有...
有什么建议吗?

编辑: 好吧,我明白我所尝试的并不能按我的预期工作。 在不将变量作为参数传递的情况下,我如何实现这一目标?

python scope nameerror
1个回答
0
投票
line

关键字对顶级命名空间中已经存在的变量没有任何作用(在本例中是

global
)。
这个 Stack Overflow 问题
讨论了原因。 您收到 NameError 的原因是因为

line

导入了

lib1.py
的命名空间,反之亦然。您在
moalibs.py
中将
line
设为全局,但
lib1.py
不导入
moalibs.py

要明白我的意思,您可以使用

lib1.py

 函数要求每个模块告诉您其当前的命名空间内容。你会发现 lib1.py 完全知道 moalibs.py 的所有标识符,但是 moalibs.py 不知道 lib1.py 的标识符。

© www.soinside.com 2019 - 2024. All rights reserved.