That’s a result of the lack of block scoping in Python.  `op` is going to 
resolve when the lambda first executes, which is always after the loop has 
finished, and scoped to the containing function so `op` will always be the 
final loop value.

Easiest workaround is to just wrap the loop contents in a function, so you get 
a fresh scope for each permutation.

def make_routes(config, cat, op):
    config.add_route…

for cat in ('actes', 'constats'):
    for op in ('archive', 'unarchive’):
       make_routes(config, cat, op)


— Theron



> On Mar 13, 2024, at 4:36 PM, Laurent Daverio <ldave...@gmail.com> wrote:
> 
> Thank you everybody, I'll try to set up a working example tomorrow.
> 
> Actually you're right, my question was formulated incorrectly, it may not be 
> a question of lambdas. Basically, I was trying to create a series of routes 
> in a reasonably concise way, something like this : 2 types of objects (actes, 
> constats), 2 operations (archive, unarchive), 2 variants (handle one object, 
> or handle a list of ids):
> 
> - /actes/{id}/archive
> - /actes/{id}/unarchive
> - /constats/{id}/archive
> - /constats/{id}/unarchive
> - /actes/-/archive_selection
> - /actes/-/unarchive_selection
> - /constats/-/archive_selection
> - /constats/-/unarchive_selection
> 
> ```
> 
> factories = {'actes':    {'fact': acte_factory,
>                           'rsrc': ActeResource},
>              'constats': {'fact': constat_factory,
>                           'rsrc': ConstatResource}}
> 
> functions = {'archive':   (_archive, _archive_multi),
>              'unarchive': (_unarchive, _unarchive_multi)}
> 
> for cat in ('actes', 'constats'):
>     for op in ('archive', 'unarchive'):
>  
>         route_name: str = f'api.{cat}.{op}'
>  
>         config.add_route(route_name, f'/{cat}/{{id}}/{op}', 
> factory=factories[cat]['fact'])
>         config.add_view(functions[op][0], route_name=route_name, 
> request_method='GET', renderer='json')
> 
>         config.add_route(route_name + '_selection', 
> f'/{cat}/-/{op}_selection')
>         config.add_view(
>             lambda request: functions[op][1](request, factories[cat]['rsrc']),
>             route_name=route_name + '_selection', request_method='POST', 
> renderer='json')
> 
> ```
> 
> The first 4 routes (those with "{id}" in them) worked fine, but last 4 (those 
> using lambdas) were all mapped to the same function (`_unarchive_multi`) in 
> the end.
> 
> In order to make them work, I had to unroll the loops and enumerate 
> everything. Ugly :(
> 
> ```
> config.add_route('api.actes.archive_selection', '/actes/-/archive_selection')
> config.add_route('api.constats.archive_selection', 
> '/constats/-/archive_selection')
> config.add_view(
>     lambda request: _archive_multi(request, ActeResource),
>     route_name='api.actes.archive_selection', request_method='POST', 
> renderer='json')
> config.add_view(
>     lambda request: _archive_multi(request, ConstatResource),
>     route_name='api.constats.archive_selection', request_method='POST', 
> renderer='json')
> 
> config.add_route('api.actes.unarchive_selection', 
> '/actes/-/unarchive_selection')
> config.add_route('api.constats.unarchive_selection', 
> '/constats/-/unarchive_selection')
> config.add_view(
>     lambda request: _unarchive_multi(request, ActeResource),
>     route_name='api.actes.unarchive_selection', request_method='POST', 
> renderer='json')
> config.add_view(
>     lambda request: _unarchive_multi(request, ConstatResource),
>     route_name='api.constats.unarchive_selection', request_method='POST', 
> renderer='json')
> ```
> 
> Laurent.
> 
> 
> 
> -- 
> You received this message because you are subscribed to the Google Groups 
> "pylons-discuss" group.
> To unsubscribe from this group and stop receiving emails from it, send an 
> email to pylons-discuss+unsubscr...@googlegroups.com 
> <mailto:pylons-discuss+unsubscr...@googlegroups.com>.
> To view this discussion on the web visit 
> https://groups.google.com/d/msgid/pylons-discuss/CAB7cU6wqp1fSXJ_6ngOBqOw2RSSTxzjAZwGoyYsoDa58OdJkPg%40mail.gmail.com
>  
> <https://groups.google.com/d/msgid/pylons-discuss/CAB7cU6wqp1fSXJ_6ngOBqOw2RSSTxzjAZwGoyYsoDa58OdJkPg%40mail.gmail.com?utm_medium=email&utm_source=footer>.

-- 
You received this message because you are subscribed to the Google Groups 
"pylons-discuss" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to pylons-discuss+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/pylons-discuss/EFA14C22-E728-43D0-A25A-30157E698935%40luhn.com.

Reply via email to