Проверка, не была ли вызвана функция в течение x времени

Я не нашел такого вопроса нигде, поэтому я собираюсь задать его здесь.

Как я могу проверить, не была ли определенная мной функция написана в течение некоторого времени?

3 ответа

Решение

Вы можете вставить последнее вызванное время в определение функции:

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

С этого момента должно быть легко определить, когда была вызвана функция. Каждый раз, когда он вызывается, он обновляет свою метку времени last_called.

Более общий подход заключается в определении функции-декоратора для присоединения свойства:

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)

Похоже, это разумное время, чтобы получить эту информацию в функции __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()
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, где ключом было имя функции, если это было то, что вы хотели сделать много...

Другие вопросы по тегам