有没有有效的方法可以在适当通知的情况下验证许多变量?

时间:2019-02-26 13:43:50

标签: python

这是我的代码:

if self.a == "":
    raise MyException("The required parameter 'a' is empty")
if self.b == "":
    raise MyException("The required parameter 'b' is empty")
if self.v == "":
    raise MyException("The required parameter 'v' is empty")
if self.g == "":
    raise MyException("The required parameter 'g' is empty")
if self.quality == "":
    raise MyException("The required parameter 'quality' is empty")
if self.abc == "":
    raise MyException("The required parameter 'abc' is empty")

似乎有太多重复的模式。问题是我找不到使它更简单和紧凑的方法。

有什么想法吗?

2 个答案:

答案 0 :(得分:6)

假设您仍要验证所有参数,这是如上所述的使用getattr的解决方案:

for attribute in ["a", "b", ...]:
    if getattr(self, attribute) == "":
        raise MyException(f"The required parameter '{attribute}' is empty")

答案 1 :(得分:1)

我不会提倡真正消除所有冗余的想法。您的代码很容易理解。用getattr()做一些聪明的事情,或者避免重复两次每个变量名,将会使一组简单的if语句变成复杂得多的事情。

也就是说,这是值得压缩代码的罕见情况之一:

if self.a == "":       raise MyException("The required parameter 'a' is empty")
if self.b == "":       raise MyException("The required parameter 'b' is empty")
if self.v == "":       raise MyException("The required parameter 'v' is empty")
if self.g == "":       raise MyException("The required parameter 'g' is empty")
if self.quality == "": raise MyException("The required parameter 'quality' is empty")
if self.abc == "":     raise MyException("The required parameter 'abc' is empty")

您可以从中提取异常引发方法;如果您在其他许多地方进行这种类型的验证,则特别有价值。

def requireNonEmpty(value, name):
    if value == "":
        raise MyException("The required parameter '{}' is empty".format(name))

requireNonEmpty(self.a, 'a')
requireNonEmpty(self.b, 'b')
requireNonEmpty(self.v, 'v')
requireNonEmpty(self.g, 'g')
requireNonEmpty(self.quality, 'quality')
requireNonEmpty(self.abc, 'abc')