29

If statements in Python allow you to do something like:

   if not x:
       print "X is false."

This works if you're using an empty list, an empty dictionary, None, 0, etc, but what if you have your own custom class? Can you assign a false value for that class so that in the same style of conditional, it will return false?

2
  • Does this answer your question? Defining "boolness" of a class in python Commented Apr 2, 2022 at 13:56
  • @iBug that question is specifically about debugging a version compatibility problem. Commented Jan 15, 2023 at 6:22

2 Answers 2

43

Since Python 3, you need to implement the __bool__ method on your class. This should return True or False to determine the truth value:

class MyClass:
    def __init__(self, val):
        self.val = val
    def __bool__(self):
        return self.val != 0  #This is an example, you can use any condition

x = MyClass(0)
if not x:
    print('x is false')

If __bool__ has not been defined, the implementation will call __len__ and the instance will be considered True if it returned a nonzero value. If __len__ hasn't been defined either, all instances will be considered True.

For further reading:


In Python 2, the special method __nonzero__ was used instead of __bool__.

Sign up to request clarification or add additional context in comments.

3 Comments

Note that it's __bool__ in Python 3.
Will this only work if I have () on the end of it? I was hoping for a method that would work whether the item was an empty list, a 0, or an instance of my object that's false. Members of this class, integers, strings, etc, will all be in a list. I need a way to universally test if any of them are false.
@Kelketek: I fleshed out the example a little. There is no need to put () anywhere, it works just like for lists and numbers.
10
class Foo:
     def __nonzero__(self): return False
     __bool__ = __nonzero__ # this is for python3

In [254]: if Foo():
   .....:     print 'Yeah'
   .....: else: print 'Nay'
   .....:
Nay

Or, if you want to be ultra-portable, you can define __len__ only, which will have the same effect in both languages, but that has the (potential) downside that it implies that your object has a meaningful measure of length (which it may not).

This will work for any instance, depending on the actual logic you put in the method.

1 Comment

"it implies that your object has a meaningful measure of length", true words of wisdom about semantics here.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.