より具体的には、with EXPR: BLOCK
文にEXPR
という関数があるかどうかを検出できますか? 私はwith
の記述をPythonで使い慣れたものにしようとしています。最初の手順として、the referenceのcontextlib.contextmanager
に表示されたマークアップされたテキストを生成する例を再実装しました(今は例外処理を無視しています)。'with'文から呼び出されたかどうかを検出する関数を記述できますか?
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>
期待どおりに動作します。私の素朴な目に
>>> 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
-statementかから呼び出された場合に呼び出し先が検出できた場合、それはなんとかようだ:その後、私はtag()
も空の要素を生成することができるかどうかだと思うようになりました。しかし、この検出が可能かどうかは分かりません。そんな道がありますか、もしあれば、どうですか?
ドキュメントには「これはHTMLを生成する実際の方法として推奨されていません」と記載されています。おそらくこれは仮説的な例ですが、そうでない場合はこれをしないでください。 :) –
警告を私に思い出させていただきありがとうございます。はい、私はそれを認識していましたが、この質問は仮説です。答え(AmberとPEP 0343が尋ねる前に読んでいたはずです)が見つかった場合、私はこの構造を働かせるためにもう少し追求したかもしれません。悲しいことではありませんでした。だから心配しないでください、この失敗した追求は私の頭の中に安全に閉じ込められています:) –