Will python never intend to support private, protected and public?
Bengt Richter
bokr at oz.net
Mon Oct 3 04:09:32 EDT 2005
On 03 Oct 2005 00:22:22 -0700, Paul Rubin <http://phr.cx@NOSPAM.invalid> wrote:
>"El Pitonero" <pitonero at gmail.com> writes:
>> The thing is, there are two sides to every coin. Features surely can
>> be viewed as "goodies", or they can be viewed as "handcuffs".
>
>Let's see, say I'm a bank manager, and I want to close my cash vault
>at 5pm today and set its time lock so it can't be opened until 9am
>tomorrow, including by me. Is that "handcuffs"? It's normal
>procedure at any bank, for good reason. It's not necessarily some
>distrustful policy that the bank CEO set to keep me from robbing the
>bank. I might have set the policy myself. Java lets me do something
>similar with instance variables. Why is it somehow an advantage for
>Python to withhold such a capability?
>
>> Sure, in these very dynamic languages you can ACCIDENTALLY override
>> the default system behavior. How many Python programmers have once
>> upon a time done stupid things like:
>> list = 3
>
>That's just a peculiarity, not any deep aspect of Python. Try it for
>'None' instead of 'list':
>
> >>> None = 3
> SyntaxError: assignment to None
>
>Why is 'list' somehow different from 'None'? I'd say there's a case
>to be made for having the compiler protect 'list' and other builtins
>the same way it protects 'None'. Python won't be any less dynamic
>because of it.
>
I think I can write you a custom import that will prevent the assignment of
a list of names you specify in the code of the imported module. Would that
be useful? Or would it be more useful to put that detection in py/lint/checker/etc
(where it probably already is?)?
Would you want to outlaw 'None' as an attribute name?
Python seems to be straddling the fence at this point:
>>> class C(object): pass
...
>>> c = C()
>>> c.None = 'c.None'
SyntaxError: assignment to None
>>> vars(c)['None'] = 'c.None'
>>> c.None
'c.None'
;-)
>> The upside is exactly the same as the fact that you can override the
>> "list()" function in Python. Python is dynamic language.
>
>That's not exactly an upside, and it has nothing to do with Python
>being dynamic. C is static but you can override 'printf'. Overriding
>'list' in Python is pretty much the same thing.
>
>> In Python, if you have a private variable:
>>
>> self._x = 3
>>
>> and you, for curiosity reasons and DURING runtime (after the program is
>> already up and running) want to know the exact moment the self._x
>> variable is accessed (say, print out the local time), or print out the
>> calling stack frames, you can do it. And I mean the program is running.
>
>So let's see:
>
> def countdown():
> n = 3
> while n > 0:
> yield n
> g = countdown()
> print g.next() # 3
> print g.next() # 2
>
>where's the Python feature that lets me modify g's internal value of n
>at this point? How is that different from modifying a private
>instance variable? "Python feature" means something in the language
>definition, not an artifact of some particular implementation. Is
>Python somehow deficient because it doesn't give a way to do that? Do
>you want to write a PEP to add a way? Do you think anyone will take
>it seriously?
I could see it as part of a debugging interface that might let you mess more
with frames in general. I wouldn't be surprised if a lot of the under-the-hood access
we enjoy as it is was a byproduct of scratching debugging-tool-need itches.
Regards,
Bengt Richter
More information about the Python-list
mailing list