and
and or
operators don't yield bool
. They don't calculate the result of the expressions into booleans, and most certainly do not give us True or False.
They return one of the objects we put in. So they are not useful only in if statements, and can't convert to a boolean by themselves (without
bool()
, that is).You might be familiar with using
or
like this since it's a common alternative to ... if ... else ...
. Take this __init__
method for example:def __init__(self, form=None): self.form = form or self.make_form()
It is straightforward, readable, and short. Pythonic indeed.
If the right operand is an expression which would throw an error, as long as the left operand is true, you don't have to worry. The right expression will not be evaluated. This is not old. We have seen it in if statements in the C language. I have used it countless times in Java to avoid
NullPointerException
. It
wouldn't make any sense for a machine or virtual machine to evaluate both expressions if the first one already evaluates to true.>>> def get_sth(): ... raise NotImplementedError ... >>> [1] or get_sth() [1] >>> [] or get_sth() Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 2, in get_sth NotImplementedError
A very good use of this is to try to tentatively get a resource in one manner which is more likely to succeed, and then try a more risky or less desireable fallback if the first manner yields nothing.
This is awesome for creating intuitively usable classes. For example, a
make_form
implementation could be a single-line "raise NotImplementedError"
, so client code can initialize the class without passing in a form object every time, but if they want to use the defaults they just have to inherit the class and make their own make_form
method. It's very practical, intuitive and informative behavior just for a single expression, isn't it?Here is the
or
expression behavior, described:- When one of the operands evaluate to
True
, return the one which evaluates toTrue
. >>> 1 or 0 1 >>> 0 or 1 1
- When both evaluate to
True
, returns the left one (python won't even look at the second operand, so you can rest assured no methods will be called, if any.) >>> 1 or [1] 1 >>> [1] or 1 [1]
- When both evaluate to
False
, returns the right one. >>> 0 or []
[]
>>> [] or 0
0
False
, but we want to use one over the other. (standard falsy values are the empty list, the empty tuple, 0, False
, None
, and the empty string).The and operator is rather interesting. It gives you:
- The right operand, when both evaluate to
True
: >>> True and 1 1 >>> 1 and True True
- the operand which evaluates to
False
, when one of them is falsy: >>> 19 and 0 0 >>> 0 and 19 0
- The left operand, when both evaluate to
False
>>> 0 and False 0 >>> False and 0 False
No comments:
Post a Comment