python - 优雅的拆包变长元组

标签 python tuples

一个真实但愚蠢的问题:

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/

相关文章:

python - 如果文件名是字符串列表的子字符串,则使用父字符串重命名文件

python - 如何将一个列表的元素添加到另一个没有括号且没有导入的列表中?

C# 7 元组和 lambda

python - 将格式设置为cursor.fetchall() 结果

C 中的 Python 扩展 - 元类

python - 使用多个逻辑条件从 numpy 数组中按列进行选择

python - 分割字符串上的多个匹配

python - n 层嵌套元组数据到带有引号的逗号分隔字符串

python - 元组的排序列表不起作用

python - 如何在任务中抛出异常?