计算 python 中函数的条目数

Counting number of entries to a function in python

我是 python 的新手。它可能看起来不太明显,但想知道 python 中是否有更简单的方法来做到这一点。

我正在尝试计算函数的条目数。要求如下:

我正在使用以下代码

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