Какой самый элегантный способ отслеживания последнего времени доступа к объекту python? - PullRequest
5 голосов
/ 05 июня 2011

У меня есть список объектов в Python, которые я бы регулярно проверял и уничтожал некоторые из них - те, к которым в последнее время не обращались (то есть никакой метод не был вызван).

Я могу сохранить последний доступ и обновлять его в каждом методе, но есть ли более элегантный способ добиться этого?

Ответы [ 5 ]

6 голосов
/ 05 июня 2011

Используйте декоратор для методов, которые вы хотите обернуть с помощью функции отметки времени, как указал @Marcelo Cantos.

Рассмотрим этот пример:

from datetime import datetime
import time
import functools

def t_access(method):
    @functools.wraps(method)
    def wrapper(self):
        self.timestamp = datetime.now()
        method(self)
    return wrapper

class Foo(object):
    @t_access
    def bar(self):
        print "method bar() called"

f = Foo()
f.bar()
print f.timestamp
time.sleep(5)
f.bar()
print f.timestamp

Редактировать: добавлено functools.wraps как указано @Peter Milley.

2 голосов
/ 05 июня 2011

Если вы используете python 3.2, взгляните на functions.lru_cache() и посмотрите, делает ли это то, что вы хотите. Это не даст вам последнего измененного времени, но очистит неиспользуемый объект.

Для более старых версий он может предоставить шаблон, который вы хотите использовать, но вам придется предоставить код.

1 голос
/ 05 июня 2011

Высокодинамичный характер Python позволяет писать прокси, которые обертывают объекты интересными способами.В этом случае вы можете написать прокси-сервер, который заменяет методы объекта (или всего класса) методами-обертками, которые обновляют метку времени, а затем делегируют вызов исходному методу.

Это несколько усложняется.Более простой механизм - использовать Python-декораторы для дополнения определенных методов.Это также позволяет вам освобождать некоторые функции, которые не представляют собой «доступ» при их вызове (если вам это нужно).

0 голосов
/ 05 июня 2011

Сохраняйте параметры соединений IMAP, вводимые с помощью идентификатора пользователя.Напишите функцию с заданным идентификатором пользователя, которая возвращает соединение IMAP.Функция будет искать идентификатор пользователя в dict, и, если идентификатор пользователя есть, получить соответствующее соединение IMAP и проверить, что оно все еще живо.Если он активен, функция возвращает это соединение.Если он не активен или если идентификатор пользователя не был указан в dict, он создает новое соединение, добавляет его в dict и возвращает новое соединение.Временные метки не требуются.

0 голосов
/ 05 июня 2011

Каков охват ваших предметов? Можете ли вы заблокировать, где они хранятся и доступны? Если это так, вам следует подумать о создании какого-то специального контейнера, который будет помечать метку времени, когда объект последний раз использовался или получал доступ. Доступ к объектам будет строго контролироваться функцией, которая может пометить время последнего доступа.

...