Another try at Python's selfishness
Alex Martelli
aleaxit at yahoo.com
Fri Feb 3 10:40:38 EST 2006
Steven D'Aprano <steve at REMOVETHIScyber.com.au> wrote:
...
> > Why shouldn't
> > def self.x():
> > declare two new identifiers ("x" and "self"), too?
>
> Sure, but now the call foo.bar
"call"?
> has special meaning inside a def statement
> than elsewhere. Elsewhere, foo.bar is an attribute access, looking up
> attribute bar in foo's namespace.
or setting it, as in foo.bar=23, or setting both names, as in
import foo.bar
> Using your syntax, in a def statement
> foo.bar is a pair of declarations: it declares a name "foo", and it
> declares a second name "bar".
"declares" isn't really pythonic -- let's talk about binding or setting
names, instead.
> This inconsistency is, I think, worse than the implicit use of self.
I don't think there's any inconsistency in deciding that syntax x.y has
different meanings (as to what gets looked up or bound) in different
contexts, because it already does: mostly "look up y in namespace x",
but in x.y=... it's "bind y in namespace x" and in "import x.y" it's
"bind x AND then bind y in namespace y".
Since "def x.y(..." is currently a syntax error, it would introduce no
backwards compatibility to assign a meaning to it. Since the 'def'
statement binds something to the name that follows it (which currently
must be a plain identifier), that's what it should do if it allowed the
following name to be a compound one, too.
Unfortunately, none of this suggests that it's reasonable to have
def x.y(z): ...
mean the same as
def y(x, z): ...
and I have no idea of how it would generalize to def x.y.z(t): ...
(while import x.y.z generalizes in a pretty obvious way wrt import x.y).
So, I'm not supporting the OP's idea; just rejecting the specific
objections to it.
Alex
More information about the Python-list
mailing list