You are viewing a plain text version of this content. The canonical link for it is here.
Posted to mod_python-dev@quetz.apache.org by Sean Treadway <se...@superchannel.org> on 2003/08/31 23:05:31 UTC

Local scope in PSP

Hi all, two things.

First, are there archives of this list?

Second... I've entered into the realm of some python demi-voodoo,
tracking down a non-intuitive behavior of calling functions defined
within a PSP page.  Please correct my interpretation of the cause, or
the terminology of the description if it is incorrect.

Problem: Calling a function defined in a PSP page from the same PSP page
works, but calling a function defined in a PSP page from another
function defined in the same PSP page raises a NameError.

Test case:  

Given the following PSP source:

<%
def world(req):
	req.write('world')

def hello_world(req):
	req.write('Hello ')
	world(req)

hello_world(req)
%>

The expected output is:  """Hello world"""

The actual output is:

"""Hello 
Mod_python error: "PythonHandler mod_python.psp"

Traceback (most recent call last):

...

  File "/home/seant/www/test.psp", line 9, in ?
    

NameError: global name 'world' is not defined
"""

I have tracked this down to the overriding of the local scope within
lib/python/mod_python/psp.py during the execution of the code fragment.
The second optional parameter to the "exec code in globals(), {'req':
req ...}" statement affects the local scope, overriding the actual local
scope defined within the compiled source.

Resolution:

Execute the code object in a modified global scope, adding the
additional variables to a copy of the global variables instead of
passing a predefined local scope.  This allows each PSP page to define
its own local scope.

Below is a patch against the current CVS release 3.1.0a.  Would you
please review it because there may be a reason the "mod_python"
variables were passed in the local scope.

Thanks to all that made this smart solution
-Sean


Index: psp.py
===================================================================
RCS file: /home/cvspublic/httpd-python/lib/python/mod_python/psp.py,v
retrieving revision 1.20
diff -r1.20 psp.py
261,262c261,266
<             exec code in globals(), {"req":req, "session":session,
<                                      "form":form, "psp":psp}
---
>             global_scope = globals().copy()
>             global_scope.update({"req":req, "session":session,
>                                  "form":form, "psp":psp})
> 
>             exec code in global_scope
>



Re: Local scope in PSP

Posted by "Gregory (Grisha) Trubetskoy" <gr...@apache.org>.
Good catch Sean! I checked this patch in.

Grisha


On Sun, 31 Aug 2003, Sean Treadway wrote:

> Hi all, two things.
>
> First, are there archives of this list?
>
> Second... I've entered into the realm of some python demi-voodoo,
> tracking down a non-intuitive behavior of calling functions defined
> within a PSP page.  Please correct my interpretation of the cause, or
> the terminology of the description if it is incorrect.
>
> Problem: Calling a function defined in a PSP page from the same PSP page
> works, but calling a function defined in a PSP page from another
> function defined in the same PSP page raises a NameError.
>
> Test case:
>
> Given the following PSP source:
>
> <%
> def world(req):
> 	req.write('world')
>
> def hello_world(req):
> 	req.write('Hello ')
> 	world(req)
>
> hello_world(req)
> %>
>
> The expected output is:  """Hello world"""
>
> The actual output is:
>
> """Hello
> Mod_python error: "PythonHandler mod_python.psp"
>
> Traceback (most recent call last):
>
> ...
>
>   File "/home/seant/www/test.psp", line 9, in ?
>
>
> NameError: global name 'world' is not defined
> """
>
> I have tracked this down to the overriding of the local scope within
> lib/python/mod_python/psp.py during the execution of the code fragment.
> The second optional parameter to the "exec code in globals(), {'req':
> req ...}" statement affects the local scope, overriding the actual local
> scope defined within the compiled source.
>
> Resolution:
>
> Execute the code object in a modified global scope, adding the
> additional variables to a copy of the global variables instead of
> passing a predefined local scope.  This allows each PSP page to define
> its own local scope.
>
> Below is a patch against the current CVS release 3.1.0a.  Would you
> please review it because there may be a reason the "mod_python"
> variables were passed in the local scope.
>
> Thanks to all that made this smart solution
> -Sean
>
>
> Index: psp.py
> ===================================================================
> RCS file: /home/cvspublic/httpd-python/lib/python/mod_python/psp.py,v
> retrieving revision 1.20
> diff -r1.20 psp.py
> 261,262c261,266
> <             exec code in globals(), {"req":req, "session":session,
> <                                      "form":form, "psp":psp}
> ---
> >             global_scope = globals().copy()
> >             global_scope.update({"req":req, "session":session,
> >                                  "form":form, "psp":psp})
> >
> >             exec code in global_scope
> >
>
>