views:

506

answers:

2

What truth value do objects evaluate to in Python?

Related Questions

+3  A: 

Update: Removed all duplicate infomation with Meder's post

For custom objects in Python < 3.0 __nonzero__ to change how it is evaluated. In Python 3.0 this is __bool__ (Reference by e-satis)

It is important to understand what is meant by evaluate. One meaning is when an object is explicitly casting to a bool or implicitly cast by its location (in a if or while loop).

Another is == evalutation. 1==True, 0==False, nothing else is equal via ==.

>>> None==False
False
>>> 1==True
True
>>> 0==False
True
>>> 2==False
False
>>> 2==True
False

Finally, for is, only True or False are themselves.

Casebash
Custom objects can return True/False for boolean evaluation by implementing __nonzero__
dcrosta
+4  A: 

Any object can be tested for truth value, for use in an if or while condition or as operand of the Boolean operations below. The following values are considered false:

  • None

  • False

  • zero of any numeric type, for example, 0, 0L, 0.0, 0j.

  • any empty sequence, for example, '', (), [].

  • any empty mapping, for example, {}.

  • instances of user-defined classes, if the class defines a __nonzero__() or __len__() method, when that method returns the integer zero or bool value False.

All other values are considered true -- so objects of many types are always true. Operations and built-in functions that have a Boolean result always return 0 or False for false and 1 or True for true, unless otherwise stated. (Important exception: the Boolean operations "or" and "and" always return one of their operands.)

http://www.python.org/doc/2.5.2/lib/truth.html

And as mentioned, you can override with custom objects by modifying nonzero.

meder
Just need to note that in Python 3.0 `__bool__` needs to be overridden instead
Casebash
The docs you quote are imprecise (or incomplete); for example, sets are neither sequences nor mappings, yet, when empty, they're also false. I would collapse those two lines (also covering the case of sets) to "any empty **container**".
Alex Martelli