2010-01-17 24 views
2

問題:如何殺死一個實例或確保我正在創建一個新的python通用feedparser實例?不需要的python feedparser實例化遺蹟


信息:

我工作的一個程序,現在是下載和目錄大量的博客。它運行良好,除了一個不幸的錯誤。我的代碼設置爲獲取博客URL列表並通過for循環運行它們。每運行一次,它會挑選一個url並將其發送到一個單獨的類,該類管理將數據下載,提取和保存到文件。

第一個網址工作得很好。它下載整個博客並將其保存到文件中。但是下載的第二個博客也將包含第一個博客的所有數據,我完全不知道爲什麼。


代碼片段:

class BlogHarvester: 
    def __init__(self,folder): 
    f = open(folder,'r') 
    stop = folder[len(folder)-1] 
    while stop != '/': 
     folder = folder[0:len(folder)-1] 
     stop = folder[len(folder)-1] 
    blogs = [] 
    for line in f: 
     blogs.append(line) 

    for herf in blogs: 
     blog = BlogParser(herf) 
     sPath = "" 
     uid = newguid()##returns random hash. 
     sPath = uid 
     sPath = sPath + " - " + blog.posts[0].author[1:5] + ".blog" 
     print sPath 
     blog.storeAsFile(sPath) 

class BlogParser: 
    def __init__(self, blogherf='null', path='null', posts = []): 
    self.blogherf = blogherf 

    self.blog = feedparser.parse(blogherf) 
    self.path = path 
    self.posts = posts 
    if blogherf != 'null': 
     self.makeList() 
    elif path != 'null': 
     self.loadFromFile() 

class BlogPeices: 
    def __init__(self,title,author,post,date,publisher,rights,comments): 
    self.author = author 
    self.title = title 
    self.post = post 
    self.date = date 
    self.publisher = publisher 
    self.rights = rights 
    self.comments = comments 

我包括片段我想這可能是有用的。對不起,如果有任何令人困惑的文物。這個程序一直是一個痛苦的屁股。

+0

+1非常有組織的問題 – jjj

+0

謝謝,我試試。^_^ – Narcolapser

回答

0

至於什麼伊格納西奧說,這發生在默認參數在函數列表中的任何突變會留在類的生活。

http://docs.python.org/reference/compound_stmts.html#function-definitions

默認參數值被評估 當函數定義執行 。這意味着 表達式會被計算一次,當定義了 函數時,並且該 每個調用都使用相同的「預先計算」值。這是特別 重要的是理解,當默認 參數是可變對象,諸如 列表或詞典:如果 函數修改(附加項到列表例如通過 )的對象,則 默認值是實際上經過修改。 這通常不是 的意圖。解決這個問題的方法是使用 None作爲默認值,並明確地 在 函數的主體中測試它。

但是,這帶來了一種疑難雜症,你正在修改參考...所以,你可以修改列表,這是預期不會修改類的消費:

例如:

class A: 
    def foo(self, x = []): 
    x.append(1) 
    self.x = x 

a = A() 
a.foo() 
print a.x 
# prints: [1] 
a.foo() 
print a.x 
# prints: [1,1] # !!!! Consumer would expect this to be [1] 
y = [1,2,3] 
a.foo(y) 
print a.x 
# prints: [1, 2, 3, 1] 
print y 
# prints: [1, 2, 3, 1] # !!!! My list was modified 

如果你要,而不是複製:(見http://docs.python.org/library/copy.html

import copy 
class A: 
    def foo(self, x = []): 
    x = copy.copy(x) 
    x.append(1) 
    self.x = x 

a = A() 
a.foo() 
print a.x 
# prints: [1] 
a.foo() 
print a.x 
# prints: [1] # !!! Much better =) 
y = [1,2,3] 
a.foo(y) 
print a.x 
# prints: [1, 2, 3, 1] 
print y 
# prints: [1, 2, 3] # !!!! My list is how I made it 
+0

但是我不是在聲明每個循環的新blogparser類嗎?還是它堅持一些如何? – Narcolapser

+0

函數foo的默認參數在類的生命期間(不是對象)持續存在。 def foo(self,x = []): 因此對列表「[]」的引用是持久的(並且引用到您的類的每個時刻)。 – Eld

+0

工作。至少它清除了另外一個bug。仍然沒有工作,但我應該能夠自己找出下一個。謝謝!這非常有幫助。 – Narcolapser

1

問題是posts=[]。缺省參數是在編譯時計算的,而不是運行時計算的,所以對象的變化在類的整個生命週期中保持不變。而是使用posts=None和測試:

if posts is None: 
    self.posts = [] 
+0

不確定你的意思,你能詳細說明一下嗎?謝謝。 – Narcolapser

+0

編譯代碼,創建一個列表,一個可變對象。每次調用該方法時,該列表都將作爲帖子傳遞。每次都是一樣的列表。 –

+0

謝謝。這工作。我主要是因爲他引用了python文檔而給出了Eld的答案。那對我來說真的是這樣。但你們倆都非常有幫助。^_^ – Narcolapser