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?.