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