【发布时间】:2017-06-28 14:00:18
【问题描述】:
我最近一直想知道是否有办法检测上下文管理器是否嵌套。
我创建了 Timer 和 TimerGroup 类:
class Timer:
def __init__(self, name="Timer"):
self.name = name
self.start_time = clock()
@staticmethod
def seconds_to_str(t):
return str(timedelta(seconds=t))
def end(self):
return clock() - self.start_time
def print(self, t):
print(("{0:<" + str(line_width - 18) + "} >> {1}").format(self.name, self.seconds_to_str(t)))
def __enter__(self):
return self
def __exit__(self, exc_type, value, traceback):
self.print(self.end())
class TimerGroup(Timer):
def __enter__(self):
print(('= ' + self.name + ' ').ljust(line_width, '='))
return self
def __exit__(self, exc_type, exc_val, exc_tb):
total_time = self.seconds_to_str(self.end())
print(" Total: {0}".format(total_time).rjust(line_width, '='))
print()
此代码以可读格式打印计时:
with TimerGroup("Collecting child documents for %s context" % context_name):
with Timer("Collecting context features"):
# some code...
with Timer("Collecting child documents"):
# some code...
= Collecting child documents for Global context ============
Collecting context features >> 0:00:00.001063
Collecting child documents >> 0:00:10.611130
====================================== Total: 0:00:10.612292
但是,当我嵌套 TimerGroups 时,事情就搞砸了:
with TimerGroup("Choosing the best classifier for %s context" % context_name):
with Timer("Splitting datasets"):
# some code...
for cname, cparams in classifiers.items():
with TimerGroup("%s classifier" % cname):
with Timer("Training"):
# some code...
with Timer("Calculating accuracy on testing set"):
# some code
= Choosing the best classifier for Global context ==========
Splitting datasets >> 0:00:00.002054
= Naive Bayes classifier ===================================
Training >> 0:00:34.184903
Calculating accuracy on testing set >> 0:05:08.481904
====================================== Total: 0:05:42.666949
====================================== Total: 0:05:42.669078
我需要做的就是以某种方式缩进嵌套的 Timers 和 TimerGroups。我应该将任何参数传递给他们的构造函数吗?或者我可以从课堂上检测到吗?
【问题讨论】:
-
您可以更改
TimerGroup以接受另一个计时器组作为“父计时器组”,并在每个TimeGroup实例中存储缩进(如果没有父则为0,如果没有父则为parent.indentation + 1有一个)
标签: python nested with-statement contextmanager