计算 python 中函数的条目数
Counting number of entries to a function in python
我是 python 的新手。它可能看起来不太明显,但想知道 python 中是否有更简单的方法来做到这一点。
我正在尝试计算函数的条目数。要求如下:
- 每 5 秒触发一次计时器事件,通过该事件反过来触发回调 (ev_5ms())
- 等到 20 秒,然后清除计数器并重新开始
我正在使用以下代码
counter = 0
"Callback"
def ev_5s():
if counter < 4:
counter += 1
else
counter = 0
print('Send Message')
t = EventGenerator.TimerEventGenerator(1, ev_1s())
t.start()
错误回溯:
Traceback (most recent call last):
File "C:/Users/i8479/Desktop/Python/HPP_SM.py", line 28, in <module>
t = EventGenerator.TimerEventGenerator(1, ev_1s())
File "C:/Users/i8479/Desktop/Python/HPP_SM.py", line 21, in ev_1s
if counter < 4:
UnboundLocalError: local variable 'counter' referenced before assignment
我正在像使用 c 或 cpp 一样进行编码。我如何在 python 中执行此操作?
其中一个解决方案是 global
:
counter = 0
# Callback
def ev_5s():
global counter
if counter < 4:
counter += 1
else
counter = 0
print('Send Message')
t = EventGenerator.TimerEventGenerator(1, ev_1s())
t.start()
这意味着您将变量 counter 传递给函数
要更改的行
def ev_5s(counter):
要更改的其他行
t = EventGenerator.TimerEventGenerator(1, ev_1s(counter))
这样做的 Pythonic 方式是使用装饰器 class,例如:
from functools import wraps
import time
class EventCounter(object):
def __init__(self, reset_span):
self.reset_span = reset_span
self.running = False
self.start_t = None
self.counter = 0
def __call__(self, f):
@wraps(f)
def wrapper(*args, **kwargs):
if not self.running:
self.start_t = time.time()
self.counter += 1
self.running = True
elif (time.time() - self.start_t) > self.reset_span:
self.start_t = time.time()
self.counter = 0
else:
self.counter += 1
print(f"Counter: {self.counter}")
return f(*args, **kwargs)
return wrapper
@EventCounter(2)
def foo():
print("Foo")
运行:
for _ in range(5):
foo()
time.sleep(1)
结果:
Counter: 1
Foo
Counter: 2
Foo
Counter: 0
Foo
Counter: 1
Foo
Counter: 0
Foo
这里有 live example
我是 python 的新手。它可能看起来不太明显,但想知道 python 中是否有更简单的方法来做到这一点。
我正在尝试计算函数的条目数。要求如下:
- 每 5 秒触发一次计时器事件,通过该事件反过来触发回调 (ev_5ms())
- 等到 20 秒,然后清除计数器并重新开始
我正在使用以下代码
counter = 0
"Callback"
def ev_5s():
if counter < 4:
counter += 1
else
counter = 0
print('Send Message')
t = EventGenerator.TimerEventGenerator(1, ev_1s())
t.start()
错误回溯:
Traceback (most recent call last):
File "C:/Users/i8479/Desktop/Python/HPP_SM.py", line 28, in <module>
t = EventGenerator.TimerEventGenerator(1, ev_1s())
File "C:/Users/i8479/Desktop/Python/HPP_SM.py", line 21, in ev_1s
if counter < 4:
UnboundLocalError: local variable 'counter' referenced before assignment
我正在像使用 c 或 cpp 一样进行编码。我如何在 python 中执行此操作?
其中一个解决方案是 global
:
counter = 0
# Callback
def ev_5s():
global counter
if counter < 4:
counter += 1
else
counter = 0
print('Send Message')
t = EventGenerator.TimerEventGenerator(1, ev_1s())
t.start()
这意味着您将变量 counter 传递给函数
要更改的行
def ev_5s(counter):
要更改的其他行
t = EventGenerator.TimerEventGenerator(1, ev_1s(counter))
这样做的 Pythonic 方式是使用装饰器 class,例如:
from functools import wraps
import time
class EventCounter(object):
def __init__(self, reset_span):
self.reset_span = reset_span
self.running = False
self.start_t = None
self.counter = 0
def __call__(self, f):
@wraps(f)
def wrapper(*args, **kwargs):
if not self.running:
self.start_t = time.time()
self.counter += 1
self.running = True
elif (time.time() - self.start_t) > self.reset_span:
self.start_t = time.time()
self.counter = 0
else:
self.counter += 1
print(f"Counter: {self.counter}")
return f(*args, **kwargs)
return wrapper
@EventCounter(2)
def foo():
print("Foo")
运行:
for _ in range(5):
foo()
time.sleep(1)
结果:
Counter: 1
Foo
Counter: 2
Foo
Counter: 0
Foo
Counter: 1
Foo
Counter: 0
Foo
这里有 live example