一个真实但愚蠢的问题:
https://github.com/joshmarshall/tornadorpc/blob/master/tornadorpc/base.py
def start_server(handlers, ...):
...
for (route, handler) in handlers:
...
通常“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]
?
最佳答案
如果该处理程序采用关键字参数,则对第三个元素使用字典:
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:])
其中 args
是一个包含 0 个或更多元素的元组。
在 Python 3 中,您可以使用 splat (*
) 目标处理任意宽度的解包:
for route, handlers, *args in handlers:
其中 *args
在解包中捕获 0 个或多个 extra 值。
另一条路线,到 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)]
关于python - 优雅的拆包变长元组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17967426/