6

一个真实的,如果愚蠢的问题:

https://github.com/joshmarshall/tornadorpc/blob/master/tornadorpc/base.py

def start_server(handlers, ...):
    ...
    for (route, handler) in handlers:
        ...

通常“处理程序”是 2 元素元组的列表。但是使用这个特定的解决方案(Tornado),您可以将第三个参数传递给特定的处理程序(kw args)。因此,“处理程序”中的元组有时可能有 2 个元素,有时也可能有 3 个元素。

我需要循环解压。当然,我可以做一些像长度检查或尝试..除了拆包。啊。

你能想出比这更好/更聪明的事情吗:

In [8]: handlers
Out[8]: [(1, 2), (3, 4, 5), (6, 7)]


In [9]: new_handlers = [x + (None,) for x in handlers]

?

4

2 回答 2

8

如果该处理程序采用关键字参数,则对第三个元素使用字典:

handlers = [(1, 2, {}), (3, 4, {'keyword': 5), (6, 7, {})]

for route, handler, kwargs in handlers:
    some_method(route, handler, **kwargs)

或者您可以使用*args语法应用参数;在这种情况下,只需捕获循环中的所有值:

for args in handlers:
    some_method(*args)

如果您必须解压缩成至少 2 个参数,请在单独的步骤中执行此操作:

for handler in handlers:
    route, handler, args = (handler[0], handler[1], handler[2:])

whereargs将是 0 个或更多元素的元组。

*在 Python 3 中,您可以使用 splat ( ) 目标处理任意宽度的解包:

for route, handlers, *args in handlers:

where在解包中*args捕获 0 个或更多额外值。

另一条路线,以handlers最小长度的元素可以通过以下方式完成:

[(h + (None,) * 3)[:3] for h in handlers]

演示:

>>> handlers = [(1, 2), (3, 4, 5), (6, 7)]
>>> [(h + (None,) * 3)[:3] for h in handlers]
[(1, 2, None), (3, 4, 5), (6, 7, None)]
于 2013-07-31T10:06:46.503 回答
2

从 Python 3 开始,您可以使用PEP 3132扩展解包:

for route, handler, *kw in handlers:
    ...

如果这不是一个选项,请与中介解包:

for handler in handlers:
    (route, handler), kw = handler[:2], handler[2:]
于 2013-07-31T10:08:14.100 回答