python – 检测上下文管理器嵌套
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – 检测上下文管理器嵌套,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2881字,纯文字阅读大概需要5分钟。
内容图文
我最近一直想知道是否有办法检测上下文管理器是否嵌套.
我创建了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.我应该将任何参数传递给他们的构造函数吗?或者我可以从班级内部发现吗?
解决方法:
如果您需要做的就是根据您正在执行的嵌套上下文管理器的数量来调整缩进级别,那么请使用名为indent_level的类属性,并在每次进入和退出上下文管理器时对其进行调整.类似于以下内容:
class Context:
indent_level = 0
def __init__(self, name):
self.name = name
def __enter__(self):
print(' '*4*self.indent_level + 'Entering ' + self.name)
self.adjust_indent_level(1)
return self
def __exit__(self, *a, **k):
self.adjust_indent_level(-1)
print(' '*4*self.indent_level + 'Exiting ' + self.name)
@classmethod
def adjust_indent_level(cls, val):
cls.indent_level += val
并将其用作:
>>> with Context('Outer') as outer_context:
with Context('Inner') as inner_context:
print(' '*inner_context.indent_level*4 + 'In the inner context')
Entering Outer
Entering Inner
In the inner context
Exiting Inner
Exiting Outer
内容总结
以上是互联网集市为您收集整理的python – 检测上下文管理器嵌套全部内容,希望文章能够帮你解决python – 检测上下文管理器嵌套所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。