2017-09-01 97 views
0

我不知道如何描述這個問題,但我會嘗試。python在for循環中列出Bug

背景信息

我在我的Django的web應用程序的功能,用戶可以導入其他用戶。用戶可以通過拖放導入.csv文件,該文件被轉換爲JSON 2D陣列(使用Papaparse JS)

在視圖中,我遍歷2D數組中的元素並創建一個「Importuser」,其中包含一些屬性,如「名字」,「姓氏」,電子郵件等。

class Importuser: 
    firstname = None 
    lastname = None 
    email = None 
    import_errors = [] 
    def __init__(self, fn, ln, e): 
     self.firstname = fn 
     self.lastname = ln 
     self.email = e 

class Importerror: 
    message = None 
    type = None 
    def __init__(self, m, t): 
     self.message = m 
     self.type = t 

在for循環中,我還驗證了電子郵件地址,以便沒有加倍的用戶。

data = jsonpickle.decode(method.POST["users"]) 
users = [] 
for tempuser in data: 
    u = validate(Importuser(tempuser[0], tempuser[1], tempuser[2]) 
    users.append(u) 

在驗證功能,我檢查是否有同一個電子郵件

def validate(user : Importuser): 
    user_from_db = User.objects.filter(email=user.email) 
    if user_from_db: 
     user.import_errors.append(Importerror("The user exists already!", "doubleuser")) 
    return user 

問題

任何用戶的for循環完成所有用戶後具有相同的錯誤,但不是當我在for循環中打印每個用戶時。每個用戶的Importerror-Object引用相同的內存位置,但在我的測試導入中應該只有一個用戶出錯。

test.csv:

Dave,Somename,[email protected] 
Joe,Somename2,[email protected] 
Yannik,Somename3,[email protected] <<That's me (exsiting user) 

我做錯了嗎?有人能幫我理解爲什麼會發生這種情況嗎?

+0

沒有,因爲我檢查是否從該數據庫的用戶是無 – Yannik

回答

1

您已經定義import_errors爲一類級別的靜態的,所以它的Importuser所有實例之間共享。

參見:Static class variables in Python

爲了您的具體問題,重寫你的類作爲

class Importuser: 
    def __init__(self, firstname, lastname, email): 
     self.firstname = firstname 
     self.lastname = lastname 
     self.email = email 
     self.import_errors = [] 

class Importerror: 
    def __init__(self, message, type): 
     self.message = message 
     self.type = type 
+0

感謝您的答案,但它不工作 – Yannik

+0

「不工作」對調試沒有幫助。 – AKX

+0

你對不起,但我不能給你更多的信息,因爲調試器沒有告訴我什麼。我只能看到,在執行for循環時,每個用戶在列表中沒有Importerror-Object,直到最後一個用戶被驗證(錯誤的)。 – Yannik

0

import_errorsImportUser的類屬性。這應該是一個實例屬性:

class Importuser: 

    def __init__(self, fn, ln, e): 
     self.firstname = fn 
     self.lastname = ln 
     self.email = e 
     self.import_errors = []