[Python-ideas] Mitigating 'self.' Method Pollution
Michael Hewitt
michael at hewitts.us
Sat Jul 11 18:04:53 CEST 2015
I am officially dropping my original proposal in favor of Nick's. Using a
single '.' prefix to reference class variables is brilliant. It has the
added benefit of scoping auto-completion within IDEs, which is incredibly
helpful for beginners and veterans alike.
As an aside, I have learned that long functions are bad form (reference
Robert Martin's Clean Code series - #3 Functions). Using short functions
with descriptive names has revolutionized code readability at my company.
Incidentally, it also mitigates concerns about distinguishing locals from
class variables.
Additionally, I would caution against allowing a lesser used language
feature (decorators) to drive the design of a more common feature (field
references in methods).
I want to thank you folks for helping to shape one of the most beautiful
languages I have encountered. I apologize for the hit-and-run, but I can
see that being a part of this discussion is not good for my health, causing
me to send emails at 1AM and stew about the issue all night, so I will need
to withdraw.
My primary reason for exploring Python was as a 'first language' for my son
and also as a potential option for future introductory programming courses
that I might teach. Except for 'self' redundancy, it is a nearly ideal
first language. Hopefully my feedback has been useful.
Michael
On Sat, Jul 11, 2015 at 1:40 AM, Nick Coghlan <ncoghlan at gmail.com> wrote:
> On 11 July 2015 at 17:25, Michael Hewitt <michael at hewitts.us> wrote:
> > Let's compare two versions of a method taken from some code that my 11
> year
> > old son wrote yesterday:
> >
> > Current
> >
> > global height
> > def keep_moving_gravity(self):
> > self.y += self.gravity
> > self.y = max(self.y, 0)
> > self.y = min(self.y, height - 1)
> >
> > Proposed
> >
> > global height
> > def keep_moving_gravity(self):
> > self y, gravity
> > y += gravity
> > y = max(y, 0)
> > y = min(y, height - 1)
>
> Alternative proposal:
>
> def keep_moving_gravity(self):
> .y += .gravity
> .y = max(.y, 0)
> .y = min(.y, height - 1)
>
> The main objection folks have to the declarative proposal is the fact
> that there's nothing obvious at the point of reference to indicate
> whether we're manipulating a local variable or an instance variable. I
> can speak from experience in saying that there's a reason the "m_*"
> prefix notation for C++ member variables is popular: it makes C++
> method implementations much easier to read when you can tell at a
> glance if a line is working with an instance member or a local
> variable. With the language not providing that separation by default,
> folks added it by convention.
>
> An "implied attribute reference" proposal would be different: it could
> build on the same mechanism that powers zero-argument super to make it
> possible to say "if I reference an object attribute in a function
> without saying which object I'm referring to, then I mean the first
> parameter".
>
> This should work cleanly for standalone functions, class methods,
> instance methods, etc, as the compiler already keeps track of the
> necessary details in order to implement PEP 3135
> (https://www.python.org/dev/peps/pep-3135/#specification)
>
> The main downside is that a leading dot isn't as good a visual
> indicator as a dot appearing between two other characters. That could
> potentially be alleviated with a double-dot notation:
>
> def keep_moving_gravity(self):
> ..y += ..gravity
> ..y = max(..y, 0)
> ..y = min(..y, height - 1)
>
> The downside of *that* is it might make people start thinking in terms
> stepping up scopes, rather than referring to the first parameter.
>
> Regards,
> Nick.
>
> --
> Nick Coghlan | ncoghlan at gmail.com | Brisbane, Australia
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20150711/02fdffed/attachment.html>
More information about the Python-ideas
mailing list