Warning of missing side effects

Dave Angel davea at ieee.org
Sat May 2 09:35:50 EDT 2009


Tobias Weber wrote:
> Hi,
> being new to Python I find remarkable that I don't see any side effects. 
> That's especially true for binding. First, it is a statement, so this 
> won't work:
>
>    if x = q.pop():
>       print x # output only true values
>
> Second, methods in the standard library either return a value OR modify 
> the reciever, so even if assignment was an expression the above wouldn't 
> work.
>
> Only it still wouldn't, because IF is a statement as well. So no ternary:
>
>    x = if True: 5 else: 7;
>
> However there is one bit of magic, functions implicitly return None. So 
> while the following will both run without error, only one actually works:
>
>    x = 'foo'.upper()
>    y = ['f', 'b'].reverse()
>
> Now I mentioned that the mutable types don't have functions that mutate 
> and return something, so I only have to remember that...
>
> But I'm used to exploiting side effect, and sometimes forget this rule 
> in my own classes. IS THERE A WAY to have the following produce a 
> runtime error?
>
>    def f():
>       x = 5
>       # no return
>
>    y = f()
>
> Maybe use strict ;)
>
>   
There's a ternary operator.  Check out the following sequence:

a = 42
b = 12 if a == 42 else 9
print a, b


Then try it again with a different value of a.

As for using = in an ordinary expression, I don't really miss it.  
Python allows multiple assignments in the same statement, but they're 
all to the same object.  For the kinds of things where I would have done 
an assignment inside an if or while (in C++), I usually can use a list 
comprehension or somesuch.





More information about the Python-list mailing list