Python 无穷定时器测试代码计数失败循环失败
我正在测试我的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])