首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我能写一个函数来检测它是否从‘with’语句中被调用吗?

我能写一个函数来检测它是否从‘with’语句中被调用吗?
EN

Stack Overflow用户
提问于 2011-01-15 12:54:24
回答 1查看 258关注 0票数 1

更具体地说,我可以检测一个函数是否在with EXPR: BLOCK语句中被调用为EXPR吗?我想让自己熟悉with-statement在python中的用法。作为第一步,我重新实现了一个生成标记文本的示例,它出现在contextlib.contextmanagerthe reference中(暂时忽略异常处理)。

代码语言:javascript
复制
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()是否也可以生成空元素:

代码语言:javascript
复制
>>> 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调用的,这似乎是可行的。然而,我不知道这种检测是否可能。有没有这样的方法,如果有,又是如何做到的?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-01-15 13:05:29

实际上,您并没有从with语句中调用tag()。调用tag(),然后将返回值从tag()传递给with语句,然后该语句对传入的值调用__enter__,然后运行主体,然后调用__exit__

因此,在实际调用with语句之前(即在调用tag()之后),您无法检测到它。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4698064

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档