On 6 May 2015 at 10:26, Saoili <sao...@gmail.com> wrote:
> Eg. code BEFORE
>             for loop_var in a_dict['loop_vars']:
>                 d = self.returns_a_deferred(loop_var["x"])
>                 d.addCallback(
>                     lambda ret_val: self.do_another_thing(
>                         other_param, loop_var.copy(), ret_val
>                     )
>                 )
>                 _dlist.append(d)
>             return defer.DeferredList(_dlist)
>
> Eg. code AFTER
>             def other_func(ret_val, other_param, loop_var):
>                 return self.do_other_thing(
>                     other_param, loop_var, ret_val
>                 )
>
>             for loop_var in a_dict['loop_vars']:
>                 d = self.returns_a_deferred(loop_var["x"])
>                 d.addCallback(other_func, other_param, loop_var)
>                 _dlist.append(d)
>             return defer.DeferredList(_dlist)

There's another common trick for dealing with this, that relies on the
fact that default argument values are evaluated when the lambda
expression itself (not the body of the lambda!) is initially
evaluated; basically, just add an extra parameter with a default value
of the loop variable. For example:

             for loop_var in a_dict['loop_vars']:
                 d = self.returns_a_deferred(loop_var["x"])
                 d.addCallback(
                     lambda ret_val, loop_var=loop_var: self.do_another_thing(
                         other_param, loop_var.copy(), ret_val
                     )
                 )
                 _dlist.append(d)
             return defer.DeferredList(_dlist)

However, separating the code out into a separate function may serve to
make the code clearer.
-- 
mithrandi, i Ainil en-Balandor, a faer Ambar

_______________________________________________
Twisted-Python mailing list
Twisted-Python@twistedmatrix.com
http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python

Reply via email to