【发布时间】:2012-01-11 17:47:09
【问题描述】:
我有一个带有许多输入参数的函数,我需要一个函数,该函数将为值为 '' 或 None 的每个参数返回参数名称(不是值)列表
通常我会在这种方法中抛出异常。如果有人想通过抛出异常来解决问题,那很好。我仍然要求函数返回参数名称列表。
总结
- 返回未设置参数的参数名称列表
- “unset”表示参数的值不是空字符串或None
- 接受单个参数:单个维度列表或字典
- 列表应包含完整的空参数名称集
- 我需要它向后兼容 Python 2.2 和 Jython
- 2.2 不可协商。代码必须在我们无权升级的遗留系统上运行。糟透了。
- 参数不是命令行参数,而是 功能。
- 参数存储在单独的变量中,但如果需要,我可以手动将它们放入字典中。
- 不是返回 Python 变量名称列表,而是返回每个空变量的用户友好描述列表。示例:“数据库名称”与“db_name”。
对提出的问题的回答:
- 如果遇到未知参数怎么办?我们不在乎。我们创建参数列表以验证并仅选择那些由于系统逻辑而必需的参数。因此,我们永远不会将未知参数放入要验证的参数列表中
- 对于非强制性或必须以其他方式验证的 UI 参数(int vs. string 等)怎么办?我们不会将非强制性参数放在传递给验证函数的列表中。对于其他更复杂的验证,我们会单独处理这些,即席。这个函数看起来很方便的原因是因为空参数是我们做的最常见的验证,并且为每个函数编写一个
if not foo:在函数之间变得乏味,我们有很多函数。 -
请解释“”“我们平台的性质”“”。还有“”“它到达单个变量”“”......什么命名空间中的单个变量? “”“(预处理)”“”是什么意思? – 约翰·马钦 2 天前。答:变量在全局命名空间中。我们使用代码注入(类似于 C 预处理器将代码替换为宏名称的方式,不同之处在于我们将变量值替换为标签,类似于:
DATABASE_NAME = ^-^将用户输入的数据库名称变量放在这里^-^
预处理器运行后会这样结束:
DATABASE_NAME = "DB1"
这是一个具体的例子,说明为什么一个简单的方法抛出异常是行不通的。我已根据请求重写为使用异常而不是返回值:
def validate_parameters(params_map):
"""
map is like {foo: "this is foo"}
"""
missing_params_info = []
for k,v in params_map.items():
if not k:
missing_params_info.append(v)
if missing_params_info:
raise TypeError('These parameters were unset: %s' % missing_params_info)
params = {}
params['foo'] = '1'
params['bar'] = '2'
params['empty'] = ''
params['empty2'] = ''
params['None'] = None
params_map = {
params['foo']: 'this is foo',
params['bar']: 'this is bar',
params['empty']: 'this is empty',
params['empty2']: 'this is empty2',
params['None']: 'this is None',
}
print validate_parameters(params_map)
bash-3.00# python /var/tmp/ck.py
Traceback (most recent call last):
File "/var/tmp/ck.py", line 26, in ?
print validate_parameters(params_map)
File "/var/tmp/ck.py", line 10, in validate_parameters
raise TypeError('These parameters were unset: %s' % missing_params_info)
TypeError: These parameters were unset: ['this is empty2', 'this is None']
它对我们不起作用的两个原因:它只打印 empty2,即使还有另一个空参数“empty”。 “empty”被“empty2”覆盖,因为它们在映射中使用相同的键。
第二个原因:我需要在运行此函数后的某个时间点将描述列表放入一个变量中。也许这在例外情况下是可能的,但我现在不知道如何。
我发布的答案似乎可以解决所有这些问题,但并不理想。我已将问题标记为已回答,但如果有人发布更好的答案,我会更改它。
谢谢!
【问题讨论】:
-
请定义“验证”。这是否意味着“有价值”?此外,返回“用户友好的描述”而不是正确的结果是一件可怕的事情。非常糟糕。请重新考虑并澄清您的要求。
func( **some_map )作为将任意映射作为参数传递给函数的一种方式有什么问题? -
Validate表示参数的值不是''或者None。它必须通过测试:"if foo:" 为 True。我意识到描述要求很糟糕,但这是必须将参数值链接到 UI 上面向用户的字段的结果。你能详细说明 func( **some_map ) 吗?我不明白。我知道这是指向地图的指针,但不确定如何解决问题。谢谢!
-
要详细说明返回“正确结果”,这意味着返回例如包含参数本身和描述的映射。如果地图为空,则成功。如果不是,我们有我们要报告的错误列表。
-
“通常我会在这种方法中抛出异常。”好的。 “我宁愿把它留给调用者来确定结果是否需要例外或只是一个警告。”什么?异常确实留给调用者处理异常、将其更改为警告或让应用程序崩溃。例外是总是正确的做法。请重新考虑您的要求。还。请不要添加 cmets。请更新问题以使其更清楚。
-
如果提供了 unknown 参数名称,您想做什么?引发异常?