0

我在任何地方都没有找到这种问题,所以我要在这里问。

如何检查我编写的某些特定函数是否在 x 时间内没有被调用?

4

3 回答 3

2

您可以在函数定义中嵌入最后调用时间:

def myfun():
  myfun.last_called = datetime.now()
  # … do things

从这一点来看,应该很容易判断函数何时被调用。每次调用它都会更新它的 last_call 时间戳。

更通用的方法是定义一个函数装饰器来附加属性:

def remembercalltimes(f, *args, **kwargs):
    """A decorator to help a function remember when it was last called."""
    def inner(*args, **kwargs):
        inner.last_called = datetime.now()
        return f(*args, **kwargs)
    return inner

@remembercalltimes
def myfun():
    # … do things

>>> myfun()
>>> myfun.last_called
>>> datetime.datetime(2014, 3, 19, 11, 47, 5, 784833)
于 2014-03-19T15:11:34.153 回答
0
import time
last_time_f_called = time.time()

def f():
  global last_time_f_called
  now = time.time()
  time_since = now - last_time_f_called
  last_time_f_called = now
  # do whatever you wanted to do about value of time_since

类似的东西?

您可以将其包装在一个装饰器中,该装饰器在 dict 中更新时间,其中 key 是函数名称,如果这是您想做的事情很多...

于 2014-03-19T15:14:01.753 回答
0

这似乎是一个合理的时间将这些信息放入函数中__dict__,也许可以使用装饰器。

def lastcalled(func):
    def inner():
        from datetime import datetime
        then = func.__dict__.get('lastcalled')
        diff = int((datetime.now() - then ).total_seconds()) if then else None
        print('Last called: {}'.format('{} sec ago'.format(diff) if diff else 'Never'))
        func()
        func.lastcalled = datetime.now()
    return inner

演示:

@lastcalled
def f():
    print('printing in f()')

f()
Last called: Never 
printing in f()

#wait 5 seconds

f()
Last called: 5 sec ago
printing in f()
于 2014-03-19T15:21:16.570 回答