You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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'

问题原因

  1. eqparse.py顶层的global indexlist和global counter完全无效:模块级别不需要用global声明变量,直接赋值才会创建模块级变量,原代码只声明不赋值,导致模块中根本不存在这两个变量。
  2. 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编程习惯:

  1. 修改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
  1. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 16:30:58