2013-10-21 16 views
1

我有一個生成器,通過過濾器從多個文件中返回行。它看起來像這樣:爲什麼我的發生器掛起而不是拋出異常?

def line_generator(self): 
    # Find the relevant files 
    files = self.get_files() 

    # Read lines 
    input_object = fileinput.input(files) 
    for line in input_object: 

     # Apply filter and yield if it is not *None* 
     filtered = self.__line_filter(input_object.filename(), line) 
     if filtered is not None: 
      yield filtered 

    input_object.close() 

self.get_files()返回的文件路徑或空列表的列表的方法。我試過做s = fileinput.input([]),然後打電話s.next()。這是它掛起的地方,我不明白爲什麼。我試圖變pythonic,而不是自己處理所有的錯誤,但我想這是一個沒有辦法解決的問題。或者在那裏?

不幸的是,我現在沒有辦法在Linux上測試它,但是有人可以在Linux上嘗試以下操作,並評論他們得到了什麼?

import fileinput 
s = fileinput.input([]) 
s.next() 

我在Windows上用Python 2.7.5(64位)。

所有的一切,我真的很想知道:

這是一個錯誤的Python或我是做錯了什麼? 不應該.next()總是返回一些東西,或者提高一個StopIteration

+0

程序「掛起」是什麼意思?你如何執行它?你看到的輸出是什麼?你想要的輸出是什麼?另外:「這是Python的錯誤,還是我做錯了什麼?」答案總是*用戶做錯了什麼。在Python中發現錯誤的機會非常渺茫,特別是對於像你這樣的「微不足道」的代碼。你應該簡單地忽略這種可能性,因爲它只會讓你有時間思考它會是什麼樣的錯誤。 – Bakuriu

+0

我正在使用IDLE來完成一切。我在這裏製作了som屏幕截圖:http://ge.tt/9dh4hqv Snap1.png在運行上述命令之後。當我按Ctrl + C打破它時,Snap2.png是輸出。基本上只是掛在Snap1.png描繪的狀態,除非你打破它。 – beruic

回答

5

fileinput默認爲標準輸入,如果列表爲空,所以它只是等待輸入內容。

一個顯而易見的解決將是擺脫fileinput(是不是非常有用無論如何),並要明確,如蟒蛇禪宗提示:

for path in self.get_files(): 
    with open(path) as fp: 
     for line in fp: 
     etc 
+0

這太棒了!在我的初步測試中,也獲得了25%的性能提升。謝謝:) – beruic

2

正如其他人已經回答了,我嘗試回答一個具體的子項:

不應該.next()總是返回一些東西,或者提高一個StopIteration

是的,但是在返回應該發生時沒有指定:在幾毫秒,幾秒甚至更長的時間內。

如果你有一個阻塞迭代器,你可以定義它的一些包裝,以便它在不同的線程內運行,填充一個列表或其他東西,並且初始線程獲取一個接口來確定是否有數據,如果有目前沒有數據或者資源是否耗盡。

如果需要,我可以詳細闡述這一點。

+0

不需要,我明白了,但如果你喜歡它,堅持下去:) – beruic

相關問題