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: [email protected]
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
[email protected]
http://lists.ironpython.com/listinfo.cgi/users-ironpython.com
_______________________________________________
users mailing list
[email protected]
http://lists.ironpython.com/listinfo.cgi/users-ironpython.com
_______________________________________________
users mailing list
[email protected]
http://lists.ironpython.com/listinfo.cgi/users-ironpython.com