Python动态输入验证
我有一个控制结构,看起来像这样:
entries = [
{'sql_col' : 'name', 'display_text' : 'Enter your name: '},
{'sql_col' : 'email', 'display_text' : 'Enter your email: '},
{'sql_col' : 'zip', 'display_text' : 'Enter your Zip Code: '},
]
在这个entries
列表中,每一项代表一个用户在对话框中填写的文本框。我想为这个结构中的每个输入指定一个验证函数,也就是说:
entries = [
{'sql_col' : 'name', ... , 'validate' : lambda x: return is_name_valid(x)},
{'sql_col' : 'email', ... , 'validate' : lambda x: return is_email_valid(x)},
...
]
问题是我搞不清楚该用什么正确的语法来实现这个功能。我的entries
语法是对的吗?我该如何在代码中调用验证函数,并把用户的输入作为参数传递给它呢?
另外,最好的答案是那种我不需要安装任何新模块的,因为我在使用的系统上没有足够的权限去进行安装。
1 个回答
3
问题是我搞不清楚该用什么样的语法。我的输入语法正确吗?
你试过吗?你收到的错误信息应该能直接告诉你哪里不对,并指明错误发生的位置,这样想帮你的人也能更容易找到解决办法:
{'sql_col' : 'name', 'validate' : lambda x: return is_name_valid(x)},
^
SyntaxError: invalid syntax
问题在于,lambda
只允许使用表达式,而不允许使用语句,而 return
是一种语句。在 lambda
中你不需要 return
,因为它会自动返回表达式的计算结果。所以:
{'sql_col' : 'name', 'validate' : lambda x: is_name_valid(x)},
不过,值得注意的是,lambda x: foo(x)
和直接传递 foo
是完全一样的,只是写得更啰嗦,速度也慢一些。所以,最好这样写:
{'sql_col' : 'name', 'validate' : is_name_valid},
我该如何在代码后面调用验证函数,并把用户的输入作为参数传递给它?
你可以像访问字典中的其他成员一样访问它——它是一个函数并不重要,因为在 Python 看来,函数也是正常的值。
而且你调用它的方式和调用其他函数是一样的——它是一个表达式而不是字面量名称并不重要,因为在 Python 看来,能够计算出一个函数(或其他可调用对象)的表达式也是完全正常的可调用对象。
所以:
if entry['validate'](value):
print('Good value!')