我有一个看起来像这样的控制结构:
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
语法是否正确?我将如何在代码中调用验证函数并将用户输入作为参数传递给它?
另外,最好的答案是我不需要安装任何新模块 - 我没有足够的权限在我用来进行任何安装的系统上。
答案 0 :(得分:3)
问题是我无法找出用于此类事情的正确语法。我的条目语法是否正确?
你试过吗?您收到的错误消息应该立即告诉您它不是,并指出它出错的地方,并给任何想要帮助您解决问题的读者:
{'sql_col' : 'name', 'validate' : lambda x: return is_name_valid(x)},
^
SyntaxError: invalid syntax
问题是lambda
不允许语句,只是表达式,return
是一个语句。您在return
中不需要lambda
,因为它会自动返回表达式计算的内容。所以:
{'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!')