On Thu, Nov 1, 2012 at 11:58 AM, Roberto Longobardi <[email protected]>wrote:

> It works fine, unless the function itself has some code that writes to a
> variable named like one of the parameters.
>
> In this case, I get an unbound local variable error when trying to use the
> input parameter.
>
> I guess this is just standard Python closures behavior, but wanted to
> check with you guys anyway:
>
>
>     def save_stuff(self, t_action, t_id, t_name):
>         @with_transaction(self.env)
>         def do_save_stuff(db):
>             cursor = db.cursor()
>
>             if t_action == 'ADD':
>                 # "Offending" row
>                 t_id = self.get_next_id()
>                 cursor.execute("""
>                     INSERT INTO stuff (id, name)
>                         VALUES (%s,%s)
>                 """, (t_id, t_name))
>             else:
>
>                 # I get an error here for unbound local t_id variable
>                 # unless I comment out the "t_id = self.get_next_id()" row
> above
>
>                 cursor.execute("""
>                     UPDATE stuff
>                         SET name = %s
>                         WHERE id = %s
>                 """, (t_name, t_id))
>

Yup, this is standard Python behavior.  Some references:

http://docs.python.org/2/faq/programming.html#why-am-i-getting-an-unboundlocalerror-when-the-variable-has-a-value
http://eli.thegreenplace.net/2011/05/15/understanding-unboundlocalerror-in-python/

The easiest fix here would be using a local variable local_t_id, within the
nested function, whose value defaults to the value of t_id -- like:

   def save_stuff(self, t_action, t_id, t_name):
        @with_transaction(self.env)
        def do_save_stuff(db):

            local_t_id = t_id

            cursor = db.cursor()

            if t_action == 'ADD':
                # "Offending" row
                local_t_id = self.get_next_id()
                cursor.execute("""
                    INSERT INTO stuff (id, name)
                        VALUES (%s,%s)
                """, (local_t_id, t_name))
            else:
                cursor.execute("""
                    UPDATE stuff
                        SET name = %s
                        WHERE id = %s
                """, (t_name, local_t_id))

-- 
You received this message because you are subscribed to the Google Groups "Trac 
Development" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/trac-dev?hl=en.

Reply via email to