2012-05-02 2 views
1

これは少し奇妙な質問です。それはPython APIを公開するツールのコンテキストで出てきました。私たちはREPLからインタラクティブにクエリを実行するのに多くの時間を費やしています。問題の原因となる特定のイディオムは、このようなものです:Python REPL:ブロックのあとで実行するコマンドを事前に発行する

for var in slow_generator_of_giant_list(): 
    stats = update(stats, var) 
print stats 

はREPLでこれを入力するには、私はこれを入力することができます。

>>> for var in slow_generator_of_giant_list(): 
... stats = update(stats, var) 
... 

を私は今printを入力しようとすると、私は構文エラーを取得します不適切な押し込みのため。 (そうでなければ、ループの中にプリントを入れて繰り返し実行します)

Enterキーを押して次の行に進むと、ループがすぐに実行され、終了するまで待たなければなりません。

明らかに私は上記を含む関数を定義することができ、とにかくファイルに保存する価値があるかもしれませんが、一般的なケースでは構築中ですこれらはオンザフライで、REPLからのループの終わりの後に実行するコマンドを "スケジュール"する方法があるといいでしょう。ブロック区切り文字を持つ言語では、もちろん、区切り文字(および必要な文区切り文字)の後ろに置くこともできます。しかし、私の同僚たちと私はここで似たようなことをしようとすると困惑しました。

おそらく私の同僚と私が考えることができなかったトリックを行うPythonic構文の醜い乱用はありますか?また、アドホックな対話型クエリーを簡単に組み合わせて問題を回避するための推奨される方法はありますか?

ありがとうございます。

答えて

1

ない美しいが、これは動作するはずです:。

>>> mygen = slow_generator_of_giant_list() 
>>> try: 
...  while True: stats = update(stats, mygen.next()) 
... except StopIteration: 
...  print stats 
... 
+0

おかげで、 @ChristopheD。これは、遅いリスト生成関数が実際にジェネレータである場合に機能します。いくつかのケースでは残念ながら、リスト全体をまとめて一度に返す非常に遅い関数です。その場合、私は同じ問題に戻ります。ジェネレータが返るのを待ってからtryブロックを要求する方法はありません。 –

0

これは対話シェルを使用しないほうが簡単だと言えるでしょう。

ファイルを保存して実行するのはあまり手間がかかりません。あなたが使用している間だけ、それを保持しなければなりません。

私は実際にこの答えを見つけました。私は右のディレクトリ内の端末との私のテキストエディタで開いているファイルを保持し、ただで答えをモックアップのためのスクラッチパッドとして使用

関連する問題