Python中有效的数据验证

2024-04-20 07:09:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用Python和sqlite3来维护一个数据库,在插入任何内容之前,我需要对数据执行验证检查,这样我就知道,即使非常宽容的数据库会接受垃圾输入,但实际上输入的不是垃圾输入。在

为了实现这一点,一个表示数据库记录并且其字段与列1:1匹配的类将在同一个模块中使用如下方法:

def validate_path(path):
   if path == None:
      return False
   if len(path) < 5:
      return False
   if not re.search("^/[a-zA-Z0-9_/]+/$", path):
      return False
   else:
      return True

def validate_server(server):
   if server == None:
      return False
   if len(server) < 3:
      return False
   if not re.search("^[a-z][a-zA-Z0-9]+$", server):
      return False
   else:
      return True

def validate_name(name):
   if name == None:
      return False
   if len(name) < 3:
      return False
   if not re.search("^[a-z][a-z_]+$", name):
      return False
   else:
      return True

这在实现我的目标时很容易理解,但我觉得这是低效的/太多的if语句/一个非常“初学者”的方法。在

然后在我的课上,我会有一个方法,比如:

^{pr2}$

因此,在运行INSERT命令之前,我运行:

if dbrecord.validate() == False:
   # do not insert
else:
   # insert

各个验证方法保留在模块级别(不在类中),因为我在计算客户端脚本中的用户输入时使用相同的方法。例如:

while True:
  home_path = raw_input("Home directory path: ")

  if AccountTypeManager.validate_path(home_path) == False:
     print "Invalid home directory path"
     logger.debug("User input home directory path {0} deemed invalid".format(home_path))
     continue

  logger.debug("User input home directory path {0} accepted as valid input.".format(home_path))
  break

我在这两个方法中都进行了验证(除了客户端脚本输入),因为该方法可能会在其他地方或以其他不接受客户端输入的方式重新使用,而且不管数据来自何处,在进入之前必须检查它。在

我主要关心的是可维护性和可读性。我希望避免为此使用外部模块,因为我的继任者很可能没有Python经验,像我一样从头开始。我想用一种“Pythonic”的方式来完成上面的工作,这种方式在非Python背景下也很容易实现。在

我还听说在Python中,使用异常进行验证比使用真/假值更好。这是真的吗?在


Tags: path方法name数据库falsetruehomeinput
1条回答
网友
1楼 · 发布于 2024-04-20 07:09:27

我在你的代码中看到了一些冗余。我认为可以帮助你的是:

在dict中存储匹配的模式(沿着这条路线,您还必须存储长度)

将验证功能合并为一个。在

将if语句合并到python all语句中。在

考虑使用和在validate函数中找到一个false

例如

pattern_dict = {'server' : '^[a-z][a-zA-Z0-9]+$',...}

def aux_validate(my_input,input_type):
    return all([my_input is not None, re.search(pattern_dict[input_type],my_input),...])


def validate(self):
    validator = True
    for my_input,input_type in self.inputs:
        validator = validator and aux_validate(my_input,input_type)
    return validator

如果你愿意的话,我可以考虑用一个更具想象力的清单来验证

^{pr2}$

最后,这可能会被认为是固执己见,最好检查一下http://codereview.stackexchange.com

相关问题 更多 >