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.