2016-04-08 19 views
0

Pythonインタラクティブセッションから、withステートメント内にREPLループを入力する方法はありますか?PythonインタラクティブREPL with withステートメント

通常、ステートメントを使用して単一のブロック

>>> 
>>> with app.app_context(): 
>>> ... # Normally this is executed as a single block, all at once 

として実行され、私は文脈で、インタラクティブセッションでコードを実行できるようにしたいと思います。

>>> 
>>> with app.app_context(): 
>>> # do stuff here in a REPL loop 
+0

replループはどういう意味ですか? –

+0

これは、一時的にインタラクティブにしたいスクリプトや、対話的にセッションしているところですが、 'with'ブロック全体を対話形式で実行する必要はありません。 – user2357112

+0

@PadraicCunningham REPL = Eval Print Loopを読むhttps://en.wikipedia.org/wiki/Read%E2%80%93eval%E2%80%93print_loop – 00500005

答えて

2

正確にはwithの文を模倣することはできませんが、手動でapp.app_context().__enter__()を呼び出すことで近づけることができます。

例外がある場合は自動的に__exit__になりませんが、それ以外の場合は同じように動作するはずです(完了したら__exit__に電話する必要があります)。

+0

コンテキストマネージャはすべての終了条件に対して '__exit__'を呼び出し、例外の回復や例外の変更を行うことができます。しかし、私の目的のために、それは有用ではありません – 00500005

+0

ええ、そういうわけで、あなたは '__exit__'を自分で呼び出すことに言及しました。しかし、 'app_context'コンテキストマネージャが何をするか(' __exit__'メソッドはほとんどまたはまったく機能しないかもしれません)に依存しています。 – Blckknght

0

のPython 2.7でcontextmanagerと非常に単純な入力(すなわちなし変数宣言)のための完全に機能するREPL:

from contextlib import contextmanager 
import sys 
class app(object): 
    @contextmanager 
    def app_context(self): 
     sys.stdout.write(">>> ") 
     yield raw_input() 

with app().app_context() as output: 
    while True: 
     print eval(output) 
     output = app().app_context().__enter__() 

これは、より洗練されたものを処理するためにいくつかの作業が必要になります - evalであること目障りだし、^ Cの短いループを壊す良い方法はないが、うまくいくはずだ。