[英]Python dynamic input validation
我有一个看起来像这样的控件结构:
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
语法正确吗? 我该如何在代码的后面部分调用验证函数,并将用户输入作为参数传递给它?
另外,最好的答案是我不需要安装任何新模块的答案-我在用于进行任何安装的系统上没有足够的特权。
问题是我无法弄清楚用于此类内容的正确语法。 我的输入语法正确吗?
你试过了吗? 您收到的错误消息应立即告诉您它不是,并指出出现问题的地方,并向希望帮助您解决问题的读者提供提示:
{'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},
我该如何在代码的后面部分调用验证函数,并将用户输入作为参数传递给它?
您可以像访问dict的其他任何成员一样来访问它-它并不偶然是函数,因为就Python而言,函数完全是正常值。
而且您将其称为与调用任何其他函数相同—没关系,它是一个表达式,而不是文字名称,因为就Python而言,求值函数(或其他可调用对象)的表达式是完全正常的可调用对象被关注到。
所以:
if entry['validate'](value):
print('Good value!')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.