【问题标题】:Python List Bug in a for loopPython 列出 for 循环中的错误
【发布时间】:2017-09-01 14:05:24
【问题描述】:

我不知道如何描述这个问题,但我会试试看。

背景信息

我在我的 Django Web 应用程序中有一个用户可以导入其他用户的功​​能。用户可以通过拖放导入一个 .csv 文件,该文件被转换为 JSON 2D 数组(使用 Papaparse JS)

在视图中,我循环遍历 2D 数组中的元素并创建一个“Importuser”,其中包含一些属性,如“firstname”、“lastname”、email 等。

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,dave@example.com
Joe,Somename2,joe@example.com
Yannik,Somename3,yannik@example.com <<That's me (exsiting user)

我做错了什么?有人可以帮我理解为什么会这样吗?

【问题讨论】:

  • 不,因为我检查数据库中的用户是否为无

标签: python arrays django python-3.x csv


【解决方案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

【讨论】:

  • 你对,对不起,但我不能给你更多的信息,因为调试器什么也没告诉我。我只能看到,在执行 for 循环时,每个用户在列表中都没有 Importerror-Object,直到最后一个用户得到验证(错误的用户)。
  • 很抱歉还有一个错误,感谢您的努力
【解决方案2】:

import_errorsImportUser 的类属性。它应该是一个实例属性:

class Importuser:

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

【讨论】:

    猜你喜欢
    • 2018-08-04
    • 1970-01-01
    • 1970-01-01
    • 2016-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多