This is quite non-intuitive, but it is by-design. It is happening because of using a locals dictionary which is different than the globals dictionary. Note that top-level code in a .py file executes with the same locals and globals dictionary.
The following Python snippet shows that a similar issue exists in pure Python code. func1 and func2 get assigned in the locals dictionary. When executing func2, the global dictionary is looked up, and it does not have func1. >>> g={} >>> l={} >>> functions="""def func1(): print 'func1' ... def func2(): func1() ... func2() ... """ >>> exec(functions, g, l) Traceback (most recent call last): File "<stdin>", line 1, in ? File "<string>", line 3, in ? File "<string>", line 2, in func2 NameError: global name 'func1' is not defined >>> l {'func2': <function func2 at 0x01D285F0>, 'func1': <function func1 at 0x01D28930>} The following snippet shows how you can achieve what you are trying to do. The takeaway is that if you use a locals dicitionary different than the globals dictionary, you have to explicitly declare your global variables so that they get assigned in the globals dictionary. >>> g={} >>> l={} >>> functions="""global func1 ... global func2 ... ... def func1(): print 'func1' ... def func2(): func1() ... func2() ... """ >>> exec(functions, g, l) func1 -----Original Message----- From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On Behalf Of Dave Fugate Sent: Wednesday, December 20, 2006 4:33 PM To: Discussion of IronPython Subject: Re: [IronPython] Calling Methods from other Methods Thanks Ken! Looks like a bug to me and I've filed a CodePlex Work Item (see http://www.codeplex.com/IronPython/WorkItem/View.aspx?WorkItemId=6714). -----Original Message----- From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On Behalf Of kenj55 Sent: Tuesday, December 19, 2006 9:39 AM To: users@lists.ironpython.com Subject: [IronPython] Calling Methods from other Methods Hi, I'm having a problem calling one method from another when i run python within the PythonEngine. i.e. If I have the following code: string functions = "def func1():\n\treturn \"hello\"\n\n"; functions += "def func2():\n\treturn func1()\n\n"; functions += "func2()"; pyEngine.Execute(functions, module, locals); I get an error along the lines of: IronPython.Runtime.Exceptions.PythonNameErrorException: name 'func1' not defined Does anyone have any ideas where I might be going wrong? Cheers, Ken -- View this message in context: http://www.nabble.com/Calling-Methods-from-other-Methods-tf2847245.html#a7951284 Sent from the IronPython mailing list archive at Nabble.com. _______________________________________________ users mailing list users@lists.ironpython.com http://lists.ironpython.com/listinfo.cgi/users-ironpython.com _______________________________________________ users mailing list users@lists.ironpython.com http://lists.ironpython.com/listinfo.cgi/users-ironpython.com _______________________________________________ users mailing list users@lists.ironpython.com http://lists.ironpython.com/listinfo.cgi/users-ironpython.com