Python动态输入验证

0 投票
1 回答
980 浏览
提问于 2025-04-18 16:29

我有一个控制结构,看起来像这样:

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

撰写回答