我使用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中,使用异常进行验证比使用真/假值更好。这是真的吗?在
我在你的代码中看到了一些冗余。我认为可以帮助你的是:
在dict中存储匹配的模式(沿着这条路线,您还必须存储长度)
将验证功能合并为一个。在
将if语句合并到python
all
语句中。在考虑使用和在
validate
函数中找到一个false例如
如果你愿意的话,我可以考虑用一个更具想象力的清单来验证
^{pr2}$最后,这可能会被认为是固执己见,最好检查一下http://codereview.stackexchange.com
相关问题 更多 >
编程相关推荐