Will python never intend to support private, protected and public?

Steve Holden steve at holdenweb.com
Thu Sep 29 10:39:04 EDT 2005


Paul Rubin wrote:
> Dennis Lee Bieber <wlfraed at ix.netcom.com> writes:
> 
>>	Ah, but in the way of your code -- it is not "your car"... It is the
>>car you supplied to someone "hundreds of miles away"... And they are
>>perfectly free to open the hood... tamper with the engine programming, etc.
> 
> 
> I don't understand what you're getting at.  If they're free to edit
> the code, then why should they complain about private variables?  They
> can change the declaration if they need to.

Similarly they can rewrite it in Perl if they don't like it being in 
Python. So what? Most people have *zero* interest in looking behind the 
interface of the code they use, whether it's an API or a GUI.

Effectively this whole thread seems to have become an argument about 
what kind of boxes you can have around namespaces. For the vast majority 
who don't care the discussion will seem a little academic.

Should namespaces be protected? The lazy Pythonista's answer to that 
question is:

  >>> import os; f = os.popen("python -m this")
  >>> for l in f:
  ...   if "namespaces" in l.lower().split(): print l[:-1]
  ...
Namespaces are one honking great idea -- let's do more of those!
  >>>

[note that my laziness extends to the gratuitous introduction of a 
separate process to produce the source data. Can I claim extra points
for that?]

So it should come as no surprise to anyone that namespaces appear in 
many contexts in Python. So, why this sudden urge (you may wonder, if 
you don't think much about code purity) to have "private" and its 
buddies. The security police have arrived, and you can be pretty sure 
nothing much is going to be fun from here on in.

Think about it: we have a language that has an eval() function and an 
exec statement, and people are concerned that some service consumer 
shouldn't be allowed to go poking around inside namespaces? What do we 
have to do, put up signs saying "do not stab yourself with a knife"? If 
people want control without discipline (which is effectively what 
private and the like purport to do) then Python just may not be your 
language ...

Access to another object's namespace is almost invariably all-or-nothing 
in Python, which (it should not be overlooked) has introspection 
capabilities. With this ability to poke around in the bowels of the 
system to perform deep magic comes a corresponding responsibility: don't 
abuse the privilege, and behave in a disciplined (sort of) way.

To avoid naming conflicts, Python provides a mechanism (name mangling) 
which pretty much guarantees that your names won't conflict with anybody 
else's, *even if you subclass a class whose methods use the same name*. 
This was a thoughtful addition, widely ignored by experienced 
programmers. It was never intended to stop people from poking around 
under the hood - simply to ensure that you wouldn't *accidentally* start 
poking around under the hood of a parent class's implementation because 
of a name clash.

C++ and cronies are not introspective languages (Java is and, like 
Python, can mess about with its own workings; because of Java's many 
constraints this turns out to be much less fun than in Python, but of 
course Jython will give you access to many useful Java resources in a 
much saner context) and non-introspective programmers frequently recoil 
in horror when faced with the prospect of losing the training wheels :-)

Given the denizens of this particular list/newsgroup I am sure I will be 
bombarded by a host of ways I could have produced the output of "import 
this" without creating a new process. So, to try and forestall various 
further expansions of this thread, let me produce a FAQ (which is 
clearly quite bogus, since I am still writing it) for this post.

Q: It's inefficient to start another process.

A: When I need to do it six million times a second I'll remember that.
    This was a one-off example. I have already wasted more time
    discussing this issue than I would have saved in the first
    thousand runs of a rewrite.

Q: It isn't cross-platform.

A: Well it runs on Windows, Cygwin and Linux, so it doesn't do badly.

Q: You could have done it some other way.

A: Please get over this obsession. There will always be more than
    one way to do most things despite the output from a simpler (but
    non-portable) solution

    $ python -m this | grep way
    There should be one-- and preferably only one --obvious way to do it.
    Although that way may not be obvious at first unless you're Dutch.

    Note that word "obvious": nobody says you *have* to do things the
    obvious way.

Q: Are you Dutch or something?

A: No such luck. But I'm not Belgian either :-)

a-voice-said-smile-things-could-be-worse-so-i-smiled-and-sure-enough-things-got-worse-ly 
y'rs  - steve
-- 
Steve Holden       +44 150 684 7255  +1 800 494 3119
Holden Web LLC                     www.holdenweb.com
PyCon TX 2006                  www.python.org/pycon/




More information about the Python-list mailing list