「with」ステートメントから呼び出されたかどうかを検出する関数を書くことはできますか?
-
11-10-2019 - |
質問
より具体的には、関数がとして呼ばれているかどうかを検出できますか EXPR
の with 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()
呼ばれています)。
所属していません StackOverflow