New syntax for blocks
Steven D'Aprano
steven at REMOVE.THIS.cybersource.com.au
Wed Nov 11 02:25:35 EST 2009
On Tue, 10 Nov 2009 23:00:09 -0800, r wrote:
> I think what has escaped everyone (including myself until my second
> post) is the fact that what really needs to happen
Why?
> is for variable
> *assignments* to return a boolean to any "statements" that evaluate the
> assignment -- like in an "if" or "elif" construct.
I don't even understand what that means.
> The current "with"
> statement cannot replace that action and was never meant for such
> things.
>
> if range(0) as var:
> #python will never execute even one line
> #in this block because bool(var) == None
No, that's impossible. bool() always returns True or False, not None.
> #also since bool(var) equals None, the
Incorrect.
>>> True == None
False
>>> False == None
False
> #variable "var" will never be created!
That will cause no end of trouble.
if range(N) as var:
do_something_with_var()
if var:
print "Oops, this blows up if N <= 0"
Conditional assignments are a terrible idea.
> elif range(10) as var:
> #this block will execute and the variable "var"
> #will be added to appropriate namespace containing
> #a list of 10 ints
>
> var = 100 #var is still available in this namespace!
>
>
> Very clean, very elegant solution to a messy problem that pops up in
> python code quite often.
You haven't actually explained what the messy problem is.
var = range(N)
if var:
...
is not a messy problem. It's perfectly reasonable. If you need to do two
things with a value, you assign it to a name first:
var = range(N)
p = var.index(5)
var.append(42)
x = func(10)
y = x + 1
z = x*2
x = func(10)
if x:
y = x + 1
Why is the third example, with an if... test, so special that it needs
special syntax to make it a two-liner?
Would you suggest we can write this?
# instead of var = range(N)
p = range(N).index(5) as var # var might be range(N), or undefined.
var.append(42)
> It not only saves one distracting line of code
> per usage but makes the code more readable.
What distracting line of code?
--
Steven
More information about the Python-list
mailing list