1

更具体地说,我可以检测是否EXPRwith 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>

这按预期工作。然后,我开始思考是否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 调用的,这似乎是可行的。但是,我不知道这种检测是否可行。有没有这样的方法,如果有,怎么做?

4

1 回答 1

5

您实际上并没有从声明中调用tag()“来自” 。with您正在调用tag(),然后将返回值 from 传递tag()with语句,然后该语句调用__enter__传入的值,然后运行主体,然后调用__exit__.

所以不,您无法with在实际调用之前检测到该语句(在调用之后tag())。

于 2011-01-15T05:05:28.660 回答