How to rapidly check object fields for emptyness

Question:

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?

Asked By: feder

||

Answers:

To loop over all instance properties you use my_instance.__dict__

see this answer for details: Explain __dict__ attribute

Answered By: rostamn739

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.

Answered By: Riccardo Bucco

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 = any([True for x, y in your_obj.__dict__.items() if not y])

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

Answered By: Danny Varod
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.