2012-05-02 20 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

我只是說,你會發現只是爲了不使用交互式shell。

保存文件並運行它並沒有太多的努力。只要你使用它,你只需要保持它。

我確實已經在SO上找到了這個答案。我把一個文件中,在正確的目錄終端我的文本編輯器中打開,只是把它作爲一個暫存器中嘲諷了答案