栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

是否可以访问封闭的上下文管理器?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

是否可以访问封闭的上下文管理器?

不幸的是,正如评论中所讨论的,这并非在所有情况下都是可行的。创建上下文管理器后,将运行以下代码(至少在cPython
2.7中运行。我无法评论其他实现):

    case SETUP_WITH:    {        static PyObject *exit, *enter;        w = TOP();        x = special_lookup(w, "__exit__", &exit);        if (!x) break;        SET_TOP(x);            }

__exit__
方法与
SET_TOP
宏一起被压入堆栈,该宏定义为:

#define SET_TOP(v)        (stack_pointer[-1] = (v))

依次将堆栈指针设置为帧eval开始时帧值堆栈的顶部:

stack_pointer = f->f_stacktop;

其中f是frameobject.h中定义的框架对象。对于我们来说不幸的是,这就是小路的终点。只能通过以下方法定义python可访问框架对象:

static PyMemberDef frame_memberlist[] = {    {"f_back",          T_OBJECT,       OFF(f_back),    RO},    {"f_pre",          T_OBJECT,       OFF(f_pre),    RO},    {"f_builtins",      T_OBJECT,       OFF(f_builtins),RO},    {"f_globals",       T_OBJECT,       OFF(f_globals), RO},    {"f_lasti",         T_INT,          OFF(f_lasti),   RO},    {NULL}      };

不幸的是,其中不包括

f_valuestack
我们需要的东西。这是有道理的,因为
f_valuestack
它的类型是
PyObject**
,因此需要将其包装在一个对象中,以便可以以任何方式从python访问。

TL; DR:

__exit__
我们要寻找的方法仅位于一个位置,即框架对象的值堆栈,而cPython并未使python代码可以访问该值堆栈。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/431461.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号