NameError在嵌套的项目中

2024-05-14 15:53:30 发布

您现在位置:Python中文网/ 问答频道 /正文

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

有一个包含进程的主文件,它用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,没什么。。。你知道吗

有什么建议吗?你知道吗

编辑: 好吧,我明白我所尝试的并不能像我预期的那样奏效。 如何在不将变量作为参数传递的情况下实现这一点?你知道吗


Tags: 文件项目py进程tkinterdeflinepyw
1条回答
网友
1楼 · 发布于 2024-05-14 15:53:30

对于初学者来说,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的标识符。你知道吗

相关问题 更多 >

    热门问题