2011-01-15 9 views
1

より具体的には、with EXPR: BLOCK文にEXPRという関数があるかどうかを検出できますか? 私はwithの記述をPythonで使い慣れたものにしようとしています。最初の手順として、the referencecontextlib.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()も空の要素を生成することができるかどうかだと思うようになりました。しかし、この検出が可能かどうかは分かりません。そんな道がありますか、もしあれば、どうですか?

+0

ドキュメントには「これはHTMLを生成する実際の方法として推奨されていません」と記載されています。おそらくこれは仮説的な例ですが、そうでない場合はこれをしないでください。 :) –

+0

警告を私に思い出させていただきありがとうございます。はい、私はそれを認識していましたが、この質問は仮説です。答え(AmberとPEP 0343が尋ねる前に読んでいたはずです)が見つかった場合、私はこの構造を働かせるためにもう少し追求したかもしれません。悲しいことではありませんでした。だから心配しないでください、この失敗した追求は私の頭の中に安全に閉じ込められています:) –

答えて

5

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

したがって、実際に呼び出される前にwithステートメントが検出されることはありません(tag()が呼び出された後です)。

+0

簡潔な答えをありがとう。あなたの答えは私が聞きたいものではありませんが、これは影を追うことから私を救います:) –

関連する問題