具体的には、ステートメントのように関数が呼び出されているかどうかを検出できEXPR
ますwith EXPR: BLOCK
か?with
Pythonでの-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
。しかし、この検出が可能かどうかはわかりません。そのような方法はありますか、もしあれば、どのようにですか?