更具体地说,我可以检测到功能是否称为 EXPRwith 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() 叫做)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top