我想记录很多指标,比如函数执行所需的时间。我希望解决方案是轻量级的。添加一个装饰和完成。也许90%的时间是这样的:
@LogMetrics
def my_business_logic(var1):
print 'done'
但是,我也希望能够访问metrics对象,并在10%的时间内执行以下操作:
@LogMetrics
def my_business_logic(var1):
metrics.inc_counter('counter_a')
print 'done'
到目前为止,我有一个处理第一个场景的装饰器:
class LogMetrics(object):
def __init__(self, module=None):
self.module = module
def __call__(self, target):
def wrapped(*args, **kwargs):
# set up metrics
metrics = Metrics(module=module)
metrics.start_timer()
try:
result = target(*args, **kwargs)
except Exception as e:
metrics.set_fault()
raise e
finally:
metrics.stop_timer()
metrics.push()
return result
return wrapped
如何支持场景2?我想做这样的事情answer,但共识似乎是不这样做。请帮忙。。。你知道吗
唯一不涉及全局对象或禁止魔法的解决方案是将metrics对象作为可选参数传递给函数(我假设如果可以编辑它,那么可以更改它的签名):
顺便问一下,您确定要在
Metrics
内而不是在__call__
内初始化Metrics
吗?你知道吗可以向函数添加属性。我做了一个非常简单的例子(在Python3中)。
add_counter
修饰符向原始函数添加一个_counter
属性(您将改为添加一个metrics
对象)。本例中的计数器在每次调用后递增。最后,一个_orig_func
属性被添加到修饰函数中,以允许访问计数器。你知道吗相关问题 更多 >
编程相关推荐