2017-09-01 99 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 = []