更具体地说,我可以检测一个函数是否在with EXPR: BLOCK语句中被调用为EXPR吗?我想让自己熟悉with-statement在python中的用法。作为第一步,我重新实现了一个生成标记文本的示例,它出现在contextlib.contextmanager的the reference中(暂时忽略异常处理)。
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/>在我幼稚的眼里,如果被调用者能够检测到它是否是从with-statement调用的,这似乎是可行的。然而,我不知道这种检测是否可能。有没有这样的方法,如果有,又是如何做到的?
发布于 2011-01-15 13:05:29
实际上,您并没有从with语句中调用tag()。调用tag(),然后将返回值从tag()传递给with语句,然后该语句对传入的值调用__enter__,然后运行主体,然后调用__exit__。
因此,在实际调用with语句之前(即在调用tag()之后),您无法检测到它。
https://stackoverflow.com/questions/4698064
复制相似问题