python – 是否可以访问上下文管理器的__exit __()方法中的上下文对象(代码块)?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – 是否可以访问上下文管理器的__exit __()方法中的上下文对象(代码块)?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1795字,纯文字阅读大概需要3分钟。
内容图文
![python – 是否可以访问上下文管理器的__exit __()方法中的上下文对象(代码块)?](/upload/InfoBanner/zyjiaocheng/733/2e82462d27e54b13abf491da591ed3c8.jpg)
我想在exit()方法中再次调用代码对象,如果它引发异常(可能是几次,可能有延迟).我知道装饰器很容易,但我的动机是有时候我想重复一些代码片段,我不想提取到一个单独的函数并装饰它.我正在寻找这些方面的东西:
class again(object):
def __enter__(self):
pass
def __exit__(self, exc_type, exc_val, exc_tb):
if exc_type is not None:
???? # Invoke the code object again
return True # eat exception
它会像这样使用:
x = 0
with again():
print x
x += 1
if x == 1:
raise Exception('I hate 1')
而预期的产出将是:
0
1
我可以找到一种方法来获取代码对象.没有任何上下文管理器属性似乎引用它(我想这不是真正需要的,因为它的工作只是在前后做事).
有可能吗?
解决方法:
with块不作为单独的代码对象存在,所以没有.请参阅this similar question.在这种情况下,提问者试图反向(从代码块内部访问上下文管理器),但正如this answer所解释的那样,with块不是一个单独的范围,所以它实际上没有任何单独的状态.
你可以通过一个例子看到这个:
import contextlib
import dis
@contextlib.contextmanager
def silly():
yield
def foo():
print "Hello"
with silly():
print "Inside"
print "Goodbye"
然后
>>> dis.dis(foo.__code__)
2 0 LOAD_CONST 1 (u'Hello')
3 PRINT_ITEM
4 PRINT_NEWLINE
3 5 LOAD_GLOBAL 0 (silly)
8 CALL_FUNCTION 0
11 SETUP_WITH 10 (to 24)
14 POP_TOP
4 15 LOAD_CONST 2 (u'Inside')
18 PRINT_ITEM
19 PRINT_NEWLINE
20 POP_BLOCK
21 LOAD_CONST 0 (None)
>> 24 WITH_CLEANUP
25 END_FINALLY
5 26 LOAD_CONST 3 (u'Goodbye')
29 PRINT_ITEM
30 PRINT_NEWLINE
31 LOAD_CONST 0 (None)
34 RETURN_VALUE
您可以看到with块的代码就在函数的代码对象内部以及其他所有内容中.它不作为单独的代码对象存在,也不与函数代码的其余部分区分开来.你不能以任何理智的方式得到它(我的意思是,不破解字节码).
内容总结
以上是互联网集市为您收集整理的python – 是否可以访问上下文管理器的__exit __()方法中的上下文对象(代码块)?全部内容,希望文章能够帮你解决python – 是否可以访问上下文管理器的__exit __()方法中的上下文对象(代码块)?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。