我正在研究一些代码,其中一半的代码似乎是记录和计时各种事情.我发现真正的代码混乱了.我想知道仍然记录所有内容但是干净地分离日志记录和实际代码的方法是什么?
例如一些代码块可以做一些简单的事情:
for item in files:
parsed_item = parse_item(item)
但要记录它可能会产生更多的代码,这会使实际代码混乱,例如
folders = 0
files = 0
paid_users = 0
free_users = 0
for item in files:
parsed_item = parse_item(item)
if parsed_item['isFolder']:
folders += 1
else:
files += 1
if parsed_item['isPaidUser']:
paid_users += 1
else:
free_users += 1
logger.info('Parsed: %d folders %d files %d paid users %d free users' % folders, files, paid_users, free_users)
在我们使用装饰器或上下文管理器代码块然后在__exit __()方法上进行一些记录时,可能会有更清洁的东西.
with parse_files_logger() as logger:
for item in files:
parsed_item = parse_item(item)
logger.log(parsed_item)
但是热衷于看看是否有更清洁的替代品?
最佳答案 您可以利用记录器可以传递除字符串之外的其他对象的事实,并且该对象的来自str(对象)的返回值用于确定消息.因此:
class ParsedItemInfo(object):
def __init__(self):
self.folders = self.files = self.paid_users = self.free_users = 0
def add(self, item):
if item['isFolder']:
self.folders += 1
else:
self.files += 1
if item['isPaidUser']:
self.paid_users += 1
else:
self.free_users += 1
def __str__(self):
return 'Parsed: %d folders %d files %d paid users %d free users' % (self.folders, self.files, self.paid_users, self.free_users)
然后在你的“真实代码”中:
parsed_item_info = ParsedItemInfo()
for item in files:
parsed_item = parse_item(item)
parsed_item_info.add(parsed_item)
logger.info(parsed_item_info)