[Tutor] 'or' in assignment (not if statement)?

Steven D'Aprano steve at pearwood.info
Fri Dec 10 04:50:11 CET 2010


Hugo Arts wrote:

> Doesn't short-circuit evaluation refer specifically to the behavior
> where arguments are only evaluated if they need to be? It's a very
> useful feature, but not technically required for the "val = val or 1"
> behavior to work.

Yes, exactly.

Some languages (Pascal comes to mind) doesn't have short-circuit 
behaviour at all. If I've understood correctly, some languages (Algol, I 
think, but don't quote me) have short-circuiting function parameters, so 
you could do this:

x = 0
function(flag, x/0)

and the argument x/0 would only be evaluated if the function actually 
tried to use it.

Python has short-circuit behaviour for:

x or y
x and y
all(iterable)
any(iterable)
true_value if condition else false_value


> Also, returning on of its operands rather than a boolean is hardly a
> quirk, since basically all dynamic languages do it ever since perl
> made "val = val or 1" an idiom (at least, I think it was perl).

Yes, it's certainly useful and not deprecated. At worst, it's less 
common since the introduction of the ternary if operator, but it's still 
useful. You can do things like this:

extras = []  # Global list of extra names to use.

def func(x, names=None):
     # Do something with x and an optional list of names.
     names = names or extras or ['my', 'internal', 'list', 'of', 'names']
     do_stuff_with(x, names)


This means that the names actually used will be the first of:

- the function argument
- the global extras
- the built-in internal list

which is not empty. So you can override the internal list globally by 
setting extras, and you can override the global list by passing a list 
of names to the function.



-- 
Steven



More information about the Tutor mailing list