Я реализую функцию ведения журнала в статический период, и для этого необходимо получить идентификатор, чтобы определить, где вызывается функция. В настоящее время идентификатор вычисляется с помощью сериализации «inspect.stack () [1] [1:]» с помощью «pickle», и я создал ниже скрипт Python для тестирования этой функции. В настоящее время я использую модуль «проверить», но он возвращает только имя файла, номер строки, источник в этой строке.
import inspect
import hashlib
def loginfo_throttle():
frame = inspect.stack()[1][0]
print('>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>')
print(hashlib.md5(pickle.dumps(inspect.stack()[1][1:])).hexdigest())
print(inspect.getframeinfo(frame))
print('<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<')
def main():
loginfo_throttle();loginfo_throttle()
loginfo_throttle()
if __name__ == '__main__':
main()
Вывод такой, как показано ниже, а первый и второй вывод точно такие же, и в этом проблема.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
9ab15e3e3d106afca16e4155ac571152
Traceback(filename='spam.py', lineno=20, function='main', code_context=[' loginfo_throttle();loginfo_throttle()\n'], index=0)
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
9ab15e3e3d106afca16e4155ac571152
Traceback(filename='spam.py', lineno=20, function='main', code_context=[' loginfo_throttle();loginfo_throttle()\n'], index=0)
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2d63d9b94b68ba14989ffebed0b70ab2
Traceback(filename='spam.py', lineno=21, function='main', code_context=[' loginfo_throttle()\n'], index=0)
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
Обновить
То, что я хотел бы сделать на самом деле, показано ниже, поэтому различать функции в одной строке с использованием вызываемого времени сложно.
import inspect
import pickle
import time
class LoggingThrottle(object):
time_table = {}
def __call__(self, period, msg):
id = pickle.dumps(inspect.stack()[1][1:])
now = time.time()
last_time = self.time_table.get(id)
if (last_time is None) or ((now - last_time) > period):
print(msg)
self.time_table[id] = now
logging_throttle = LoggingThrottle()
def main():
for i in xrange(1000):
logging_throttle(3, 'foo'); logging_throttle(3, 'spam')
logging_throttle(3, 'bar')
time.sleep(0.1)
if __name__ == '__main__':
main()
Это выводит только «foo» и «bar».
foo
bar
foo
bar