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 "Gregory (Grisha) Trubetskoy" <gr...@apache.org> on 2003/09/02 22:45:16 UTC
Re: Local scope in PSP
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
> >
>
>