Python 我是否可以编写一个函数来检测它是否从“with”-语句调用?

Python 我是否可以编写一个函数来检测它是否从“with”-语句调用?,python,with-statement,Python,With Statement,更具体地说,我是否可以在with EXPR:BLOCK语句中检测函数是否被称为EXPR? 我试图让自己熟悉python中with语句的用法。作为第一步,我重新实现了一个生成标记文本的示例,该示例出现在contextlib.contextmanager中,目前忽略异常处理 class Markup(object): def __init__(self): self.tags = [] self.append = self.tags.append

更具体地说,我是否可以在with EXPR:BLOCK语句中检测函数是否被称为EXPR? 我试图让自己熟悉python中with语句的用法。作为第一步,我重新实现了一个生成标记文本的示例,该示例出现在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>

在我天真的眼里,如果被调用方能够检测到它是否是从with语句中调用的,这似乎是可行的。然而,我不知道这种检测是否可能。有这样一种方法吗?如果有,怎么做?

您实际上不是在with语句中调用标记。您正在调用tag,然后将tag的返回值传递给with语句,该语句随后对传入的值调用_uenter _uu,然后运行body,然后调用_uexit u


因此,不,您不能在实际调用with语句之前(即在调用标记之后)检测with语句。

您实际上不是从with语句调用标记。您正在调用tag,然后将tag的返回值传递给with语句,该语句随后对传入的值调用_uenter _uu,然后运行body,然后调用_uexit u


因此,不能在实际调用with语句之前(即在调用标记之后)检测with语句。

请注意,文档中说,这不是生成HTML的真正方法!也许这只是一个假设的例子,但如果不是,请不要这样做谢谢你提醒我这个警告。是的,我知道,这个问题是假设的。如果Amber的答案和我在提问之前应该阅读的PEP 0343的结果是相反的,那么我可能会更进一步,使这个构造工作起来。唉,这是不可能的。所以别担心,这个失败的追求被安全地锁定在我的脑海中:注意,文档中说这不是生成HTML的真正方法!也许这只是一个假设的例子,但如果不是,请不要这样做谢谢你提醒我这个警告。是的,我知道,这个问题是假设的。如果Amber的答案和我在提问之前应该阅读的PEP 0343的结果是相反的,那么我可能会更进一步,使这个构造工作起来。唉,这是不可能的。所以别担心,这一失败的追求被安全地锁在我的脑海里:谢谢你的简洁回答。虽然你的回答不是我想听到的,但这让我免于追根究底:谢谢你简洁的回答。虽然你的回答不是我想听的,但这使我免于追逐阴影:
>>> 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/>