「with」ステートメントから呼び出されたかどうかを検出する関数を書くことはできますか?

StackOverflow https://stackoverflow.com/questions/4698064

  •  11-10-2019
  •  | 
  •  

質問

より具体的には、関数がとして呼ばれているかどうかを検出できますか EXPRwith EXPR: BLOCK 声明?私はの使用に精通しようとしています with- Pythonの測定。最初のステップとして、マークアップされたテキストを生成する例を再実装しました。 参照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/>

私の素朴な目には、Calleeがそれが呼ばれているかどうかを検出できる場合、それは実行可能と思われます with- ステートメントかどうか。ただし、この検出が可能かどうかはわかりません。そのような方法はありますか、もしあれば、どのように?

役に立ちましたか?

解決

あなたは実際に電話していません tag() "から with 声明。あなたは呼んでいます tag(), 、次に、戻り値を渡します tag()with それから呼び出す声明 __enter__ その合格した価値で、体を実行してから電話をかけます __exit__.

いいえ、検出することはできません with それが実際に呼び出される前の声明(それは後です tag() 呼ばれています)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top