Emanuele D'Arrigo wrote:
Greetings everybody,
I don't quite understand why if I do this:
d = {}
exec(dir(), d)
1) d is no longer empty
2) the content of d now looks like __builtins__.__dict__ but isn't
quite it d == __builtins__.__dict__ returns false.
Can anybody shed some light?
You should check up on what exec does. In this case it runs a string
containing code using dictionary `d` as its global namespace, and so `d` has
to contain the usual global namespace symbols -- otherwise `dict` can't
work. `__builtins__.__dict__ is one of the elements in the global
namespace, not the namespace itself. Another example:
Python 2.6.2 (release26-maint, Apr 19 2009, 01:56:41)
[GCC 4.3.3] on linux2
Type help, copyright, credits or license for more information.
a=7
d={'b':a}
exec (print b, d)
7
d
{'__builtins__': {'bytearray': type 'bytearray', 'IndexError': type
'exceptions.IndexError', 'all': built-in function all, 'help': Type
help() for interactive help, or help(object) for help about object., 'vars':
built-in function vars, 'SyntaxError': type 'exceptions.SyntaxError',
'unicode': type 'unicode', 'UnicodeDecodeError': type
'exceptions.UnicodeDecodeError', 'isinstance': built-in function
isinstance, 'copyright': Copyright (c) 2001-2009 Python Software
Foundation.
[ ... ]
'AssertionError': type 'exceptions.AssertionError', 'classmethod': type
'classmethod', 'UnboundLocalError': type 'exceptions.UnboundLocalError',
'NotImplementedError': type 'exceptions.NotImplementedError',
'AttributeError': type 'exceptions.AttributeError', 'OverflowError': type
'exceptions.OverflowError'}, 'b': 7}
To get rid of the name error, you'd need
d={}
d['d'] = d
exec (dir (d), d)
Mel.
--
http://mail.python.org/mailman/listinfo/python-list