[Python-3000] Sky pie: a "var" keyword

Neil Toronto ntoronto at cs.byu.edu
Mon Oct 9 10:04:11 CEST 2006


As long as patches are flying willy-nilly and we're just kicking around 
ideas like puppies, I thought I'd offer one of my own.

No, not a puppy. An idea. Of course, if it ends up beaten to death, I 
might rather it were a puppy. My apologies if it's been discussed in 
some other form.

It occurs to me that some of Python's gotchas are due to the compiler 
not being able to determine whether the user intends to *create* a 
variable, or *modify* one.

The "global" gotcha:

x = 0
def f():
    print x   # 'local variable 'x' referenced before assignment'
    x = 3


The "read-only lexical scoping" gotcha:

def f():
    x = 0
    def g():
        x = 3   # doesn't alter outer 'x'


And the "changing a writable property name is a very bad plan" gotcha. 
This bit me severely when I was first learning Python. I changed an 
attribute name from "x" to "value" in some Bayesian network code, and 
spent hours trying to determine why it wasn't working anymore. Turns out 
I missed a "node.x = " somewhere. Nowadays, I'd write a dummy property 
named "x" that throws an exception, but that seems an extraordinarily 
hackish thing to do to support an operation that happens a lot.

A "var" keyword fixes them all. The "global" gotcha:

x = 0
def f():
    print x   # no exception - prints "0"
    x = 3

def g():
    print x   # exception
    var x = 3


The read-only lexical scoping gotcha:

def f():
    var x = 0
    def g():
        x = 3   # alters outer 'x'


And when the runtime encountered "node.x = " it would have complained 
that the variable didn't exist. The __init__ method would look like this:

def __init__(self, stuff):
   var self.stuff = stuff
   var self.x = 0
   # ...


If you don't like how it looks, we could call it "eric" instead:

   eric self.x = 0


Of course, "var" isn't a swear word in any language (as far as I know), 
but "eric" is heinously rude in Swahili.

Essentially, "var" means "make a new entry in the dictionary."

Some Zen arguments:

Explicit is better than implicit (are you creating? are you modifying?)
Complex is worse than simple (it's slightly more complex), but complex 
is better than complicated (which the scoping semantics are now)

It also has nice duality with the "del" keyword. Same number of letters 
and everything:

var x = 0
del x


If type annotations ever got into Py3k, they'd go in very naturally. 
This might also enable some compiler optimizations.

The biggest downside I can see is that it would break every scrap of 
Python code ever written.

Another puppy to kick around: If that's totally unacceptable, how about 
making the default for assignment act on a variable in the outer scope 
if one exists, and have "var" override? This would allow read/write 
lexical scoping and put the "this is meant to be new in this scope" 
decoration at the point of declaration. (I also think "this is meant to 
be new" is much cleaner than "this is meant to be old," but that's just me.)

Grovelingly,
Neil



More information about the Python-3000 mailing list