# Operator Precedence/Boolean Logic

Elizabeth Weiss cake240 at gmail.com
Thu Jun 23 00:23:49 EDT 2016

```On Wednesday, June 22, 2016 at 11:59:44 PM UTC-4, Steven D'Aprano wrote:
> On Thu, 23 Jun 2016 01:12 pm, Larry Hudson wrote:
>
> > On 06/22/2016 12:42 AM, Lawrence D’Oliveiro wrote:
> > [snip]
> >> I feel that’s a needlessly complicated rule. It would have been simpler
> >> if boolean operators (and conditional expressions like in if-statements
> >> and while-statements) only allowed values of boolean types. But that’s
> >> one of the few warts in the design of Python...
> >>
> >
> > Wart??  I *strongly* disagree.  I find it one of the strengths of Python,
> > it enhances Python's
> > expressiveness.  Of course, everyone is entitled to their own
> > opinion...and this is mine.
>
> Allowing any value as a truth value is just applying the principle of
> duck-typing to booleans.
>
> There are a pair of canonical truth values, namely True and False, but any
> object can quack like a truth value. We often call them:
>
> - true and false (as opposed to True and False);
> - true-like and false-like;
> - truthy and falsey
>
> values.
>
> Among the builtins, there's a general principle:
>
> - values that represent something should be truthy;
> - values that represent nothing should be falsey.
>
> So we have falsey values:
>
> - None
> - zeroes (0, 0.0, 0j, etc)
> - empty dict {}
> - empty sets and frozensets
> - empty strings '' and b'' (in Python 2: u'' and '')
> - empty lists, tuples and other sequences
>
> and truthy values:
>
> - object
> - non-zero numbers
> - non-empty dicts
> - non-empty sets and frozensets
> - non-empty strings
> - non-empty sequences
>
> This is an improvement over other languages like Javascript, Ruby, etc where
> the division between truthy and falsey appears to be fairly arbitrary.
>
>
>
>
> --
> Steven

Thanks, Steven!
```