[issue4381] Cannot declare multiple classes via exec when inside a function.
New submission from Kevin Fitch [EMAIL PROTECTED]: codeText = class foo(object): pass class bar(object): baz = foo() def doExec(text): exec text ### This works: # Although if I do this before the doExec below, then the # doExec doesn't fail. # exec codeText ### But this does not: doExec(codeText) The output I get is: --- type 'exceptions.NameError' Traceback (most recent call last) /home/kfitch/ipython console in module() /home/kfitch/ipython console in doExec(text) /home/kfitch/string in module() /home/kfitch/string in bar() type 'exceptions.NameError': name 'foo' is not defined I don't fully understand why the version in the function doesn't work, but I suspect it is a bug related to scoping, since foo is really doExec.foo (I think). This is with python 2.5.2 under Linux (Ubuntu 8.04) -- messages: 76202 nosy: kfitch severity: normal status: open title: Cannot declare multiple classes via exec when inside a function. versions: Python 2.5 ___ Python tracker [EMAIL PROTECTED] http://bugs.python.org/issue4381 ___ ___ Python-bugs-list mailing list Unsubscribe: http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com
[issue4381] Cannot declare multiple classes via exec when inside a function.
Amaury Forgeot d'Arc [EMAIL PROTECTED] added the comment: I agree that it is confusing; in short: a bare exec() does not play well with closures; This is a consequence of the python execution model, and is unlikely to change. Here, the class 'foo' is stored in the function's local variables. But the execution of the body of the 'bar' class searches names in its local scope (the class body) and the global scope (the module level), and misses the function's locals... I strongly suggest to avoid pure exec() statements; always specify a global and/or a local dictionary. In your case, the following works: def doExec(text): d = {} # or: d = dict(globals()) exec text in d print d.keys() -- nosy: +amaury.forgeotdarc resolution: - wont fix status: open - closed ___ Python tracker [EMAIL PROTECTED] http://bugs.python.org/issue4381 ___ ___ Python-bugs-list mailing list Unsubscribe: http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com