python - 我可以编写一个函数来检测它是否是从 'with' 语句调用的吗?

标签 python with-statement

更具体地说,我可以检测函数是否在 with EXPR: BLOCK 语句中被称为 EXPR 吗? 我试图让自己熟悉 python 中 with 语句的用法。作为第一步,我重新实现了一个生成标记文本的示例,出现在 the reference 中。 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 语句调用的,这似乎是可行的。但是,我不知道这种检测是否可行。有没有这样的方法,如果有,怎么办?

最佳答案

您实际上并不是在 with 语句中“调用”tag()。您正在调用 tag(),然后将 tag() 的返回值传递给 with 语句,然后调用 __enter__ 在传入的值上,然后运行主体,然后调用 __exit__

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

关于python - 我可以编写一个函数来检测它是否是从 'with' 语句调用的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4698064/

相关文章:

python - "chunk"、 "block"、 "offset"、 "buffer"和 "sector"是什么意思?

Python - 带可选对象的with语句

python - 使用 DBPedia 的示例 python 脚本?

python - 在 Python 中使用两个键从 MySQL 获取表作为字典

javascript - 语法错误: 'with' statements are not valid in strict mode

sql - Oracle With, Case When 语句缺少关键字

Django {% with %} 标签在 {% if %} {% else %} 标签内?

python - Python 2.7 中使用列表理解的多个 with 语句

python - 函数平方二维数组python

python - 文件名约定匹配的正则表达式