Luis
Luis

Reputation: 1475

Is there efficient way to validate many variables with appropriate notice?

This is my code:

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")

It's seems like too much repeated pattern. The issue is that I can't find a way to make it simpler and compact.

Any ideas?

Upvotes: 1

Views: 49

Answers (2)

John Kugelman
John Kugelman

Reputation: 361977

I wouldn't advocate for getting really fancy trying to eliminate all redundancy. Your code is easy to understand. Doing something clever with getattr() or whatnot to avoid repeating each variable name twice will turn a simple set of if statement into something significantly more complicated.

That said, this is one of the rare times where compacting the code is worth it:

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")

You could extract an exception raising method out of it; particularly valuable if you do this type of validation in many other places.

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

Upvotes: 1

Phydeaux
Phydeaux

Reputation: 2855

Assuming you still want to validate all arguments, here is a solution using getattr as suggested above:

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

Upvotes: 6

Related Questions