Python动态输入验证

时间:2014-08-08 00:55:44

标签: python 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语法是否正确?我将如何在代码中调用验证函数并将用户输入作为参数传递给它?

另外,最好的答案是我不需要安装任何新模块 - 我没有足够的权限在我用来进行任何安装的系统上。

1 个答案:

答案 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!')