优雅的解包可变长度元组

2024-10-03 02:40:47 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

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

我需要把这个打包成一个循环。当然,我可以做smth之类的长度检查,也可以试试……除了拆包。啊。在

你认为smth比这个更好/更聪明吗:

^{pr2}$

是吗?在


Tags: pyhttpsgithubmastercom元素basehandlers
2条回答

由于Python 3,您可以使用PEP 3132扩展解包:

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

如果这不是一个选择,请与中间人解包:

^{pr2}$

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

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

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

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

^{pr2}$

如果需要将解压为至少2个参数,请在单独的步骤中执行此操作:

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

其中args将是0个或更多元素的元组。在

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

for route, handlers, *args in handlers:

其中*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)]

相关问题 更多 >