Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Python > reassign to builtin possible !?

Reply
Thread Tools

reassign to builtin possible !?

 
 
Bernhard Merkle
Guest
Posts: n/a
 
      01-03-2008
Hi there,

I am reading Learning Python 3e from Mark Lutz and just found out that
reassigning to builtins is possible.
What is the reason, why Python allows this ? IMO this is very risky
and can lead to hard to find errors.
(see also Learning Python 3e, Chapter 16, Page 315)

>>> True

True
>>> False

False
>>> True = 1
>>> True

1
>>> True = 0
>>> True

0

TIA,
Berni
 
Reply With Quote
 
 
 
 
Diez B. Roggisch
Guest
Posts: n/a
 
      01-03-2008
Bernhard Merkle wrote:

> Hi there,
>
> I am reading Learning Python 3e from Mark Lutz and just found out that
> reassigning to builtins is possible.
> What is the reason, why Python allows this ? IMO this is very risky
> and can lead to hard to find errors.
> (see also Learning Python 3e, Chapter 16, Page 315)
>
>>>> True

> True
>>>> False

> False
>>>> True = 1
>>>> True

> 1
>>>> True = 0
>>>> True

> 0


This hal always been possible. But it's not reassigning, it's shadowing -
which is a totally different beast. Shadowing builtins is bad style, but
lokal to your context. Which can get nasty of course, if you do the above
on e.g. module level.

But you can't alter the values for True/False globally with this.

Diez
 
Reply With Quote
 
 
 
 
Bernhard Merkle
Guest
Posts: n/a
 
      01-03-2008
On Jan 3, 2:07 pm, "Diez B. Roggisch" <de...@nospam.web.de> wrote:
> This hal always been possible. But it's not reassigning, it's shadowing -
> which is a totally different beast. Shadowing builtins is bad style, but
> lokal to your context. Which can get nasty of course, if you do the above
> on e.g. module level.
>
> But you can't alter the values for True/False globally with this.


Are you sure ? what about the following example ?
Is this also shadowing ?

Python 2.5 (r25:51908, Sep 19 2006, 09:52:17) [MSC v.1310 32 bit
(Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import __builtin__
>>> __builtin__.True = False
>>> __builtin__.True

False
>>> True

False

Berni
 
Reply With Quote
 
Diez B. Roggisch
Guest
Posts: n/a
 
      01-03-2008
Bernhard Merkle wrote:

> On Jan 3, 2:07 pm, "Diez B. Roggisch" <de...@nospam.web.de> wrote:
>> This hal always been possible. But it's not reassigning, it's shadowing -
>> which is a totally different beast. Shadowing builtins is bad style, but
>> lokal to your context. Which can get nasty of course, if you do the above
>> on e.g. module level.
>>
>> But you can't alter the values for True/False globally with this.

>
> Are you sure ? what about the following example ?
> Is this also shadowing ?
>
> Python 2.5 (r25:51908, Sep 19 2006, 09:52:17) [MSC v.1310 32 bit
> (Intel)] on win32
> Type "help", "copyright", "credits" or "license" for more information.
>>>> import __builtin__
>>>> __builtin__.True = False
>>>> __builtin__.True

> False
>>>> True

> False


I'm not entirely sure what happens there, but that seems to only work in the
interactive prompt.

--------- test.py ------------


print True

if __builtins__.True == 10:
print "I'm reassigned globally"
--------- test.py -------------

Then, in the interpreter do:

droggisch@ganesha:/tmp$ python
Python 2.5.1 (r251:54863, Oct 5 2007, 13:36:32)
[GCC 4.1.3 20070929 (prerelease) (Ubuntu 4.1.2-16ubuntu2)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
Welcome to rlcompleter2 0.96
for nice experiences hit <tab> multiple times
>>> __builtins__.True = 10
>>> import test

10
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "test.py", line 5, in <module>
if __builtins__.True == 10:
AttributeError: 'dict' object has no attribute 'True'
>>>



Diez
 
Reply With Quote
 
Jeroen Ruigrok van der Werven
Guest
Posts: n/a
 
      01-03-2008
-On [20080103 14:47], Bernhard Merkle () wrote:
>Are you sure ? what about the following example ?
>Is this also shadowing ?


It is, as it is local to your current executing interpreter. Any other Python
process that is currently running is unaffected by your shadowing. So as Diez
says, you are not tampering with it on a persistent global level.

--
Jeroen Ruigrok van der Werven <asmodai(-at-)in-nomine.org> / asmodai
イェルーン ラウフãƒ*ック ヴァン デル ウェルヴェン
http://www.in-nomine.org/ | http://www.rangaku.org/
Any fool can make a rule. And every fool will mind it...
 
Reply With Quote
 
Tim Chase
Guest
Posts: n/a
 
      01-03-2008
>> But you can't alter the values for True/False globally with this.
>
> Are you sure ? what about the following example ?
> Is this also shadowing ?
>
>>>> import __builtin__
>>>> __builtin__.True = False
>>>> __builtin__.True

> False


It doesn't seem to screw things up globally

>>> import __builtin__
>>> t = __builtin__.True
>>> __builtin__.True = False
>>> __builtin__.False = t
>>> True

False
>>> False

True
>>> 1 == 1

True
>>> import os
>>> os.path.isdir('.')

True
>>> #if they were globally redefined, this would be False
>>> #you'd have to actually reference __builtin__.True


My thought would be if you do something as daft as
redefining/shadowing True and False, you get the headaches that
ensue. Fortunately, since Python is explicit, you can trace back
through the code and see where the inanity occurred.
Additionally, any scoping rules mean that programmer stupidity
can't leak too badly outside the scope of the block containing
the stupidity.

It's the old "DIHWIDT! WDDT!" ("Doctor, it hurts when I do
this!", "well don't do that!") syndrome.

-tkc




 
Reply With Quote
 
Benjamin
Guest
Posts: n/a
 
      01-03-2008
On Jan 3, 7:04 am, Bernhard Merkle <bernhard.mer...@googlemail.com>
wrote:
> Hi there,
>
> I am reading Learning Python 3e from Mark Lutz and just found out that
> reassigning to builtins is possible.
> What is the reason, why Python allows this ? IMO this is very risky
> and can lead to hard to find errors.

I don't think it's a huge issue. In fact, I think it's a feature. For
example, it'd be extremely issue to reassign open, if you wanted to
implement a virtual file system, and you couldn't modify the module
the used open.
> (see also Learning Python 3e, Chapter 16, Page 315)
>
> >>> True

> True
> >>> False

> False
> >>> True = 1
> >>> True

> 1
> >>> True = 0
> >>> True

>
> 0
>
> TIA,
> Berni


 
Reply With Quote
 
Chris Mellon
Guest
Posts: n/a
 
      01-03-2008
On Jan 3, 2008 8:05 AM, Tim Chase <> wrote:
> >> But you can't alter the values for True/False globally with this.

> >
> > Are you sure ? what about the following example ?
> > Is this also shadowing ?
> >
> >>>> import __builtin__
> >>>> __builtin__.True = False
> >>>> __builtin__.True

> > False

>
> It doesn't seem to screw things up globally
>
> >>> import __builtin__
> >>> t = __builtin__.True
> >>> __builtin__.True = False
> >>> __builtin__.False = t
> >>> True

> False
> >>> False

> True
> >>> 1 == 1

> True
> >>> import os
> >>> os.path.isdir('.')

> True
> >>> #if they were globally redefined, this would be False
> >>> #you'd have to actually reference __builtin__.True

>
> My thought would be if you do something as daft as
> redefining/shadowing True and False, you get the headaches that
> ensue. Fortunately, since Python is explicit, you can trace back
> through the code and see where the inanity occurred.
> Additionally, any scoping rules mean that programmer stupidity
> can't leak too badly outside the scope of the block containing
> the stupidity.
>
> It's the old "DIHWIDT! WDDT!" ("Doctor, it hurts when I do
> this!", "well don't do that!") syndrome.
>


In Py3k this will be a syntax error, like assigning to None is now.
Possibly also in 2.6.
 
Reply With Quote
 
Bernhard Merkle
Guest
Posts: n/a
 
      01-04-2008
On Jan 3, 8:06 pm, "Chris Mellon" <arka...@gmail.com> wrote:
> In Py3k this will be a syntax error, like assigning to None is now.
> Possibly also in 2.6.


thanks. I feed much better with that
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
subtle error slows code by 10x (builtin sum()) - replace builtin sumwithout using import? bdb112 Python 2 07-02-2011 03:13 AM
How do I reassign USB ports Oldman@screwedup.com Computer Support 2 06-10-2006 10:28 PM
how to reassign variable biswaranjan.rath XML 3 05-05-2006 01:07 PM
Reassign value to private =?Utf-8?B?VGltOjouLg==?= ASP .Net 2 01-27-2005 10:15 AM
reassign keys in an STL map Shailesh Humbad C++ 7 11-02-2004 12:05 AM



Advertisments
 



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57