Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Python > is it a bug in exec?

Reply
Thread Tools

is it a bug in exec?

 
 
longqian9509@gmail.com
Guest
Posts: n/a
 
      01-21-2011
In pyhton 3.1, I found the following code will succeed with argument 1
to 4 and fail with argument 5 to 9. It is really strange to me. I
suspect it may be a buy in exec() function. Does anyone have some idea
about it? Thanks.


t1="""
class foo:
def fun():
print('foo')
def main():
global foo
foo.fun()
main()
"""
t2="""
class foo:
def fun():
print('foo')
def main():
foo.fun()
main()
"""

import sys
import copy
if sys.argv[1]=='1':
exec(t1)
elif sys.argv[1]=='2':
exec(t2)
elif sys.argv[1]=='3':
exec(t1,{},{})
elif sys.argv[1]=='4':
exec(t2,globals(),locals())
elif sys.argv[1]=='5':
exec(t2,{},{})
elif sys.argv[1]=='6':
exec(t2,globals(),{})
elif sys.argv[1]=='7':
exec(t2,{},locals())
elif sys.argv[1]=='8':
exec(t2,copy.copy(globals()),locals())
elif sys.argv[1]=='9':
exec(t2,globals(),copy.copy(locals()))
 
Reply With Quote
 
 
 
 
Steven D'Aprano
Guest
Posts: n/a
 
      01-21-2011
On Thu, 20 Jan 2011 20:52:15 -0800, http://www.velocityreviews.com/forums/(E-Mail Removed) wrote:

> In pyhton 3.1, I found the following code will succeed with argument 1
> to 4 and fail with argument 5 to 9. It is really strange to me. I
> suspect it may be a buy in exec() function. Does anyone have some idea
> about it? Thanks.


What makes you think it's a bug? Is there anything in the documentation
of exec that suggests to you that some other behaviour should occur? What
version of Python are you using?

Without knowing what behaviour you expect and what behaviour you see, how
are we supposed to know if you've found a bug or not?

I suggest you fire up the interactive interpreter and try this:

t1 = """
class foo:
def fun():
print('foo')

def main():
global foo
foo.fun()

main()
"""

dg = {}
dl = {}

exec(t1, dg, dl)

then inspect the values of dg and dl and see if it helps. If not, write
back with what you expect to happen, and what you see instead.


--
Steven
 
Reply With Quote
 
 
 
 
long
Guest
Posts: n/a
 
      01-21-2011
Of cause your code runs well. But if you remove the "global foo" in
main(), it will fail. And it will succeed again if you call exec(t1)
directly. I think this behavior is strange. Even I pass a shadow copy
of globals and locals to exec, it still fails. So perhaps there is a
basic difference between exec(t1,dg,dl) and
exec(t1,globals(),locals()). What do you think about it? Thanks.


On Jan 21, 2:14*am, Steven D'Aprano <steve
(E-Mail Removed)> wrote:
> On Thu, 20 Jan 2011 20:52:15 -0800, (E-Mail Removed) wrote:
> > In pyhton 3.1, I found the following code will succeed with argument 1
> > to 4 and fail with argument 5 to 9. It is really strange to me. I
> > suspect it may be a buy in exec() function. Does anyone have some idea
> > about it? Thanks.

>
> What makes you think it's a bug? Is there anything in the documentation
> of exec that suggests to you that some other behaviour should occur? What
> version of Python are you using?
>
> Without knowing what behaviour you expect and what behaviour you see, how
> are we supposed to know if you've found a bug or not?
>
> I suggest you fire up the interactive interpreter and try this:
>
> t1 = """
> class foo:
> * * def fun():
> * * * * print('foo')
>
> def main():
> * * global foo
> * * foo.fun()
>
> main()
> """
>
> dg = {}
> dl = {}
>
> exec(t1, dg, dl)
>
> then inspect the values of dg and dl and see if it helps. If not, write
> back with what you expect to happen, and what you see instead.
>
> --
> Steven


 
Reply With Quote
 
Peter Otten
Guest
Posts: n/a
 
      01-21-2011
(E-Mail Removed) wrote:

> In pyhton 3.1, I found the following code will succeed with argument 1
> to 4 and fail with argument 5 to 9. It is really strange to me. I
> suspect it may be a buy in exec() function. Does anyone have some idea
> about it? Thanks.
>
>
> t1="""
> class foo:
> def fun():
> print('foo')
> def main():
> global foo
> foo.fun()
> main()
> """
> t2="""
> class foo:
> def fun():
> print('foo')
> def main():
> foo.fun()
> main()
> """
>
> import sys
> import copy
> if sys.argv[1]=='1':
> exec(t1)
> elif sys.argv[1]=='2':
> exec(t2)
> elif sys.argv[1]=='3':
> exec(t1,{},{})
> elif sys.argv[1]=='4':
> exec(t2,globals(),locals())
> elif sys.argv[1]=='5':
> exec(t2,{},{})
> elif sys.argv[1]=='6':
> exec(t2,globals(),{})
> elif sys.argv[1]=='7':
> exec(t2,{},locals())
> elif sys.argv[1]=='8':
> exec(t2,copy.copy(globals()),locals())
> elif sys.argv[1]=='9':
> exec(t2,globals(),copy.copy(locals()))


There are only two cases that matter: identical local/global namespaces and
distinct local/global namespaces:

>>> code = """\

.... x = 42 # put x into the local namespace
.... def f():
.... print(x) # look up x in the global namespace
.... f()
.... """
>>> exec(code, {}, {})

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<string>", line 4, in <module>
File "<string>", line 3, in f
NameError: global name 'x' is not defined
>>> ns = {}
>>> exec(code, ns, ns)

42

Also note that

>>> globals() is locals()

True

on the module level.

Peter
 
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
*bug* *bug* *bug* David Raleigh Arnold Firefox 12 04-02-2007 03:13 AM
ASP.NET Login control bug or SQL 2005 bug? RedEye ASP .Net 2 12-13-2005 10:57 AM
Re: BUG? OR NOT A BUG? John ASP .Net 2 09-21-2005 10:31 AM
Bug Parade Bug 4953793 Michel Joly de Lotbiniere Java 4 12-02-2003 05:05 AM
how to report bug to g++ ? got a bug and fixed up source code DarkSpy C++ 4 06-27-2003 09:05 AM



Advertisments