Python 无穷定时器测试代码计数失败循环失败

-1 投票
1 回答
28 浏览
提问于 2025-04-14 18:31

我正在测试我的IP延迟,使用的是InfiniteTimer。我刚刚添加了一个全局的failCount变量,但当我在tick()这个回调函数中尝试增加它时,出现了错误。

错误信息显示在文件 "C:\Users\ken38\OneDrive\Projects\Python\Pinger\ping_test3.py" 的第17行,内容是:print("failCount: " + failCount)。错误类型是UnboundLocalError,意思是“局部变量 'failCount' 在赋值之前被引用”。

我猜这可能是因为InfiniteTimer在一个单独的线程中运行,无法访问全局变量。有人能给我点建议吗?

from InfiniteTimer import InfiniteTimer
from ping3 import ping, verbose_ping
import os

failCount = 0

def tick():
    clear_screen()
    r = ping('1.1.1.1')  # Returns delay in seconds.
    fin = open("data2.txt", "a")
    if(isinstance(r, (int, float))):
        fin.write("%1.2f, \n" % (r * 1000))
    else:
        fin.write("%s, ping failed\n" % r)
        failCount = failCount + 1
    print("%1.2f" % (r *1000))
    print("failCount: " + failCount)
    fin.close()
# Example Usage
#t = InfiniteTimer(0.5, tick)
#t.start()
print('Kat is testing!')

t = InfiniteTimer(1.0, tick)
t.start()

def clear_screen():
    if os.name == 'nt':  # Windows
        os.system('cls')
    else:  # Linux/Unix
        os.system('clear')

我找到了一种解决方法,但我不明白为什么原来的代码会失败。添加几个函数来管理计数器,并在回调函数tick()中调用它们,这让我觉得有点奇怪。

from InfiniteTimer import InfiniteTimer
from ping3 import ping, verbose_ping
import os

failCount = 0

def counterInc():
    failCount = failCount + 1
    return failCount

def getCounter():
    return failCount

def tick():
    failCount = 0
    clear_screen()
    r = ping('1.1.1.1')  # Returns delay in seconds.
    fin = open("data2.txt", "a")
    if(isinstance(r, (int, float))):
        fin.write("%1.2f, \n" % (r * 1000))
        failCount = getCounter()
    else:
        fin.write("%s, ping failed\n" % r)
        #failCount = failCount + 1
        failCount = counterInc()
    print("%1.2f" % (r *1000))
    print("failCount: %d" % failCount)
    fin.close()
# Example Usage
#t = InfiniteTimer(0.5, tick)
#t.start()
print('Kat is testing!')

t = InfiniteTimer(1.0, tick)
t.start()

def clear_screen():
    if os.name == 'nt':  # Windows
        os.system('cls')
    else:  # Linux/Unix
        os.system('clear')

1 个回答

0

要访问全局变量,只需在函数内部添加这一行代码,记得只加一次。

def tick():
    global failCount

    ...
    
    failCount = failCount + 1
    ...

另一种解决办法是把变量作为参数传递。

def tick(fail_counter):
    ...
    fail_counter += 1
    ...


failCount = 0

#call tick function with variable as argument
t = InfiniteTimer(1.0, tick, [failCount])

撰写回答