Home > Net >  How to rapidly check object fields for emptyness
How to rapidly check object fields for emptyness

Time:09-01

I need to check for empty values of every field of a distinct object. And I'm tiered of typing it out.

In this case. I have the an object called signal with multiple fields, which should not be empty.

if self.is_blank(signal.provider_id):
            error_response = "Signal rejected. No signal provider id given."
        elif self.is_blank(signal.sequence_id):
            error_response = "Signal rejected. No signal sequence id provided."

....

def is_blank (self, string):
        """Checks for None and empty values"""
        return True if string and string.strip() else False

Anyhow, what is the fast way in python to check all fields for "emptiness"? How do we loop them?

CodePudding user response:

You may want to use operator.attrgetter:

def is_blank(self, field_names):
    for name in field_names:
        if getattr(self, name) and getattr(self, name).strip():
            return True, name
    return False, None

...

is_blank, name = self.is_blank(['provider_id', 'sequence_id', ...])
if is_blank:
    print(f'Signal rejected. No signal {name} provided.')

You can also implement is_blank with next:

def is_blank(self, field_names):
    return next(
        ((True, name)
         for name in field_names
         if getattr(self, name) and getattr(self, name).strip()),
        (False, None),
    )

This is going to print an error message for the first field that is failing the check. All you need to do is to provide a complete list of the attributes to be checked.

CodePudding user response:

As rostamn mentioned, you can convert your object into a dictionary, after which you can loop through the (key, values) in a single line with a filter and check the result like so:

any_empty = True if ([True for x, y in your_obj.__dict__.items() if not y]) else False

Change the condition in the loop to the type of empty check you need.

CodePudding user response:

To loop over all instance properties you use my_instance.__dict__

see this answer for details: Explain __dict__ attribute

  • Related