我可以编写一个函数来检测是否从'with's-statement调用?
-
11-10-2019 - |
题
更具体地说,我可以检测到功能是否称为 EXPR
在 with EXPR: BLOCK
陈述?我试图使自己熟悉 with
- 在Python中陈述。作为第一步,我重新完成了一个示例,该示例生成了标记的文本,出现在 参考资料 的 contextlib.contextmanager
(暂时忽略异常处理)。
class Markup(object):
def __init__(self):
self.tags = []
self.append = self.tags.append
self.pop = self.tags.pop
def tag(self, name):
self.append(name)
return self
def __enter__(self):
print('<{}>'.format(self.tags[-1]))
def __exit__(self, exc_type, exc_value, traceback):
print('</{}>'.format(self.pop()))
>>> m = Markup()
>>> with m.tag('ELEMENT'):
... print('sample text')
...
<ELEMENT>
sample text
</ELEMENT>
这是按预期工作的。然后,我必须考虑是否 tag()
还可以生成空元素:
>>> m = Markup()
# if a function appears as EXPR of "with EXPR: BLOCK", 'ELEMENT' is a container element. .
>>> with m.tag('ELEMENT'):
... print('sample text')
...
<ELEMENT>
sample text
</ELEMENT>
# in other cases, ELEMENT is an empty element.
>>> m.tag('ELEMENT')
<ELEMENT/>
对我天真的眼睛,如果Callee可以检测到它是否从中调用,这似乎是可行的 with
- 陈述与否。但是,我不知道这种检测是否可能。有这样的方法吗?如果有的话,如何?
解决方案
您实际上并不是在打电话 tag()
“来自 with
陈述。你在打电话 tag()
, ,然后从 tag()
到 with
声明,然后打电话 __enter__
在该传递值上,然后运行身体,然后打电话 __exit__
.
所以不,你无法检测到 with
在调用它之前的声明(这是之后的 tag()
叫做)。
不隶属于 StackOverflow