Sei*_*gai 1 python with-statement
更具体地说,我可以检测是否EXPR在with EXPR: BLOCK语句中调用函数?我试图让自己熟悉withpython 中-statement 的用法.作为第一步,我重新实现了一个生成标记文本的示例,出现在(暂时忽略异常处理)的引用中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>
Run Code Online (Sandbox Code Playgroud)
这按预期工作.然后,我想是否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/>
Run Code Online (Sandbox Code Playgroud)
对于我幼稚的眼睛,如果被调用者能够检测到它是否从with-statement 调用,那么这似乎是可行的.但是,我不知道这种检测是否可行.有这样的方式,如果有的话,怎么样?
你实际上并没有tag()在with声明中称之为"来自" .你正在调用tag(),然后将返回值传递tag()给with语句,然后语句调用__enter__传入的值,然后运行主体,然后调用__exit__.
所以不,你with在实际调用它之前就无法检测到它(在调用之后tag()).