Python模块属性错误求助:导入eqparse时提示无counter变量
问题:Python导入模块变量报错
module 'eqparse' has no variable 'counter' 尝试从eqparse模块导入counter、indexlist等变量时触发上述错误,已尝试修改变量名但未解决,附上完整代码及错误信息,求解决方案。
main.py代码
import graphics import eqparse # NOTE: For equation mapping, it will input a string and convert the data to a table. # After, you take in the table coords and map each point # dump vars here # xypm = 0 counter = eqparse.counter patternFind = eqparse.patternFind indexlist = eqparse.indexlist # profile initialization # def init(name, nxsize, nysize, noffset, nzoom): global zoom zoom = nzoom global xsize xsize = nxsize global eqtype eqtype = bool(1) global ysize ysize = nysize global win win = GraphWin(name, nxsize, nysize) global offset offset = noffset global xymark xymark = (nzoom * -1)/2 global txsize txsize = nxsize/2 global tysize tysize = nysize/2 global txymark txymark = xymark * -1 + 1 global xp1 xp1 = Point(xypm,(txsize) + offset) global yp1 yp1 = Point((tysize) + offset, xypm) global xp2 xp2 = Point(xypm,(txsize) - offset) global yp2 yp2 = Point((tysize) - offset, xypm) # starting procedure # def startUp(): # xy lines # global xymark global xp1 global xp2 global yp1 global yp2 global xypm xtrace = Line(Point(0,tysize), Point(xsize,tysize)) ytrace = Line(Point(txsize,0), Point(txsize,ysize)) xtrace.draw(win) ytrace.draw(win) # grid drawer # while xymark < txymark: txline = Line(xp1, xp2) tyline = Line(yp1, yp2) txline.draw(win) tyline.draw(win) xypm = xypm + xsize/zoom xp1 = Point(xypm,(tysize) + offset) yp1 = Point((txsize) + offset, xypm) xp2 = Point(xypm,(tysize) - offset) yp2 = Point((txsize) - offset, xypm) xymark = xymark + 1 # code for ending mark # Line(Point(txsize - offset, ysize - 1), Point(txsize + offset, ysize - 1)).draw(win) Line(Point(xsize - 1,tysize - offset), Point(xsize - 1, tysize + offset)).draw(win) # point drawing # def drawCo(nx, ny): pCircle = Circle(Point(xsize/zoom * (nx) + xsize/2, ysize - (ysize/zoom * (ny) + ysize/2)), 3) pCircle.setFill("black") pCircle.draw(win) # main # print("Checkpoint 1") init("test",500, 500, 10, 20) print("Checkpoint 2") startUp() print("Checkpoint 3") drawCo(3,5) print("Checkpoint 4") patternFind("Dung","DungBeatlesbeingadungbeetle") print("Checkpoint 5") print(counter) print("Checkpoint 6") for x in range(len(indexlist)): print(indexlist[x]) print("Checkpoint 7") # exit function # win.getMouse() win.close()
eqparse.py代码
# eqparse will look for certain patterns in strings, generate an equation, # and create a table that a drawing function can read global indexlist global counter # convert string to valid equation data def convStr(input): if input[0] == 'y': print("Linear") elif input[0] == 'r': print("Polar") else: print("Use Equation type on left side") # subroutine that will be used to find patterns in a sequence # def patternFind(pattern, input): indexlist = [] counter = 0 l = len(pattern) tstr ="" if l > len(input): pass else: i = 0 j = len(input) - len(pattern) + 1 k=0 while j > 0: tstr = "" i=0 while len(tstr) < l: tstr = tstr + input[i + k] i = i + 1 if tstr == pattern: counter = counter + 1 indexlist.append(i+k) else: pass j = j - 1 k=k+1
错误信息
module 'eqparse' has no variable 'counter'
问题原因
- eqparse.py顶层的
global indexlist和global counter完全无效:模块级别不需要用global声明变量,直接赋值才会创建模块级变量,原代码只声明不赋值,导致模块中根本不存在这两个变量。 patternFind函数内的indexlist和counter是局部变量,函数执行完毕后就会被销毁,不会绑定到模块上。
解决方案
方案一:修复模块级变量(兼容原调用逻辑)
修改eqparse.py,初始化模块级变量并在函数内正确引用:
# eqparse will look for certain patterns in strings, generate an equation, # and create a table that a drawing function can read # 初始化模块级变量 indexlist = [] counter = 0 # convert string to valid equation data def convStr(input): if input[0] == 'y': print("Linear") elif input[0] == 'r': print("Polar") else: print("Use Equation type on left side") # subroutine that will be used to find patterns in a sequence # def patternFind(pattern, input): # 声明使用模块级的indexlist和counter global indexlist, counter # 每次调用先重置变量 indexlist.clear() counter = 0 l = len(pattern) tstr = "" if l > len(input): pass else: i = 0 j = len(input) - len(pattern) + 1 k=0 while j > 0: tstr = "" i=0 while len(tstr) < l: tstr = tstr + input[i + k] i = i + 1 if tstr == pattern: counter = counter + 1 indexlist.append(i+k) j = j - 1 k=k+1
方案二:让函数返回结果(更推荐,避免全局变量)
这种方式不需要依赖模块级变量,函数直接返回匹配次数和索引列表,符合Python编程习惯:
- 修改eqparse.py的
patternFind函数:
def patternFind(pattern, input): indexlist = [] counter = 0 l = len(pattern) tstr = "" if l > len(input): pass else: i = 0 j = len(input) - len(pattern) + 1 k=0 while j > 0: tstr = "" i=0 while len(tstr) < l: tstr = tstr + input[i + k] i = i + 1 if tstr == pattern: counter = counter + 1 indexlist.append(i+k) j = j - 1 k=k+1 # 返回结果 return counter, indexlist
- 修改main.py的调用逻辑:
删除main.py中以下两行:
counter = eqparse.counter indexlist = eqparse.indexlist
替换main部分的相关代码:
# main # print("Checkpoint 1") init("test",500, 500, 10, 20) print("Checkpoint 2") startUp() print("Checkpoint 3") drawCo(3,5) print("Checkpoint 4") # 直接接收函数返回的结果 counter, indexlist = eqparse.patternFind("Dung","DungBeatlesbeingadungbeetle") print("Checkpoint 5") print(counter) print("Checkpoint 6") for idx in indexlist: print(idx) print("Checkpoint 7")
内容的提问来源于stack exchange,提问作者asizseablewalrus
相关产品推荐
相关产品推荐

