您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

是否可以在上下文管理器的__exit __()方法内访问上下文对象(代码块)?

是否可以在上下文管理器的__exit __()方法内访问上下文对象(代码块)?

with块不作为单独的代码对象存在,所以不存在。看到类似的问题。在那种情况下,发问者正试图做相反的事情(从代码块内部访问上下文管理器),但是正如此答案所解释的,该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块的代码以及其他所有内容都位于该函数代码对象内。它不作为单独的代码对象存在,也没有与函数的其余代码区分开。您无法以任何理智的方式获取它(我的意思是,无需破解字节码)。

其他 2022/1/1 18:30:48 有465人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶