On Mon, 31 Jan 2005, [ISO-8859-1] André Roberge wrote:
> >/ I have a "robot" that can do some actions like "move()" and > />/ "turn_left()". I can program this robot using python like this: > />/ ==== > />/ .def move_and_turn(): > [snip]// > />/ The question I have is: how do I do this with an explicit dictionary. > />/ I would *guess* that this is somehow equivalent to "how do I create a > />/ dictionary that has access only to robot instructions [move(), > />/ turn_left(), etc.] and Python's basic syntax" ... but I don't know how > />/ to do this. > / > myGlobals = { 'move':move, 'turn_left':turn_left } > exec code in myGlobals > > You don't need to add built-ins to myGlobals. Add whatever of your > symbols you want the code to have access to. Hello! There's one subtlety here: exec() (as well as eval()) will automagically stuff in its own version of a '__builtins__' dictionary if a binding to '__builtins__' doesn't exist. Here's a snippet from the documentation that talks about this: """If the globals dictionary is present and lacks '__builtins__', the current globals are copied into globals before expression is parsed. This means that expression normally has full access to the standard __builtin__ module and restricted environments are propagated.""" This is a bit surprising, and caught me off guard when I played with exec myself. There are more details here: http://www.python.org/doc/ref/exec.html http://www.python.org/doc/lib/built-in-funcs.html#l2h-23 So if we really want to limit the global names that the exec-ed code sees, you may want to add one more binding to '__builtins__': ### >>> d = {} >>> exec "print int('7')" in d 7 >>> >>> d.keys() ['__builtins__'] >>> >>> >>> d2 = {'__builtins__' : {}} >>> >>> exec "print int('7')" in d2 Traceback (most recent call last): File "<stdin>", line 1, in ? File "<string>", line 1, in ? NameError: name 'int' is not defined ### Hope this helps! _______________________________________________ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor