Boolean value of objects in Python

boolean, python

Solution

In Python 2, use `__nonzero__`:

Refer to the Python 2 docs for `__nonzero__`.

class foo(object):
    def __nonzero__( self) :
        return self.bar % 2 == 0

def a(foo):
    if foo:
        print "spam"
    else:
        print "eggs"

def main():
    myfoo = foo()
    myfoo.bar = 3
    a(myfoo)

if __name__ == "__main__":
    main()

Problem

As we know, Python has boolean values for objects: If a class has a `__len__` method, every instance of it for which `__len__()` happens to return 0 will be evaluated as a boolean `False` (for example, the empty list). In fact, every iterable, empty custom object is evaluated as `False` if it appears in boolean expression. Now suppose I have a class `foo` with attribute `bar`. How can I define its truth value, so that, say, it will be evaluated to `True if bar % 2 == 0` and `False` otherwise? For example: ``` myfoo = foo() myfoo.bar = 3 def a(foo): if foo: print "spam" else: print "eggs" ``` so, `a(myfoo)` should print `"eggs"`. To close questions that are specifically about debugging an error caused by using the 3.x-specific approach in 2.x, use How can I implement conversion to boolean for classes in 2.x? Why doesn't the "__bool__" magic method work?.

Original source

Related problems