1

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

4

1 に答える 1

5

あなたは実際にステートメントをtag()「から」呼び出しているわけではありません。を呼び出してから、戻り値をステートメントに渡します。ステートメントは、with渡された値を呼び出し、本体を実行してから、を呼び出します。tag()tag()with__enter____exit__

いいえ、withステートメントが実際に呼び出される前 (呼び出された後tag()) にステートメントを検出することはできません。

于 2011-01-15T05:05:28.660 に答える