How about just getting rid of del? Removal from collections could be done
with a method call,
Which would be called object.del() I presume. And that opens a big
can of worms.
Suppose we have a list L = [4, 3, 2, 1, 0], what should L.del(1) do?
It looks like it should result in L becoming [4, 3, 2, 0]. An easy mistake
to make, if you forget that the argument is (presumably) an index.
You could make it clear by insisting on L.del[1] but that requires a big
change in Python's syntax.
What should L.del() do, with no arguments? Raise an error?
Now, you have something like this:
class thing:
pass
obj = thing()
obj.alpha = [4, 3, 2, 1, 0]
obj.beta = 5
Python's object model suggests that obj.alpha.del() should call
alpha's del method, in the same way that obj.alpha.append() would call
alpha's append method.
So how do you delete obj.alpha? obj.del("alpha") might work. But what if
obj itself is a mapping, with a key "alpha" as well as an attribute alpha.
Which one should obj.del("alpha") delete?
Now, if you said that L.del() should raise an exception earlier, what
about obj.beta.del()?
Presumably every object automatically has a del method, so you
don't have to program a del method yourself. obj.del is a method object.
So it has a del method. (Yes, sometimes you want to delete methods.
Functions are first class objects in Python.) Which has a del method.
Which has a del method.
What should obj.del.del.del.del.del.del.del.del.del() do?
and i'm not convinced that deleting variables is
something we really need to be able to do (most other languages manage
without it).
Most other languages don't have namespaces that can get polluted, or
on-the-fly creation of variables. Most other languages don't consider
variables to be simply attributes of a module object. And most other
languages don't allow you to run interactive sessions where it is easy to
mistakenly make variables you don't want.
py> x = 1
py> u = x+2 # oops, typo, meant y not u
py> del u # prevent confusion in the programmer's mind
It is also useful sometimes to delete a module object from the top level
namespace before re-importing it, rather than merely reloading it. That
requires being able to delete a variable.
In summary: del being a keyword works. del() being an object method is
unclear, confusing and complicated.