2013-07-31 107 views
2

一個真正的,如果傻問題:優雅拆包可變長度元組

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

如果處理程序需要關鍵字參數,然後用字典的第三個要素:

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中,可以處理任意寬度與圖示拆包(*)靶:

for route, handlers, *args in handlers: 

其中*args捕獲解包0以上額外值。

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

演示:

另一條路線,在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)] 
+0

我知道但處理程序不是我的問題,我的問題是「for」循環可變長度元組序列。 (並且由於tornadorpc不是我的代碼/項目,我更感興趣的是對這類問題的一般解決方案,而不是特定的龍捲風/ tornadorpc) – LetMeSOThat4U

+0

@JohnDoe:但是如果你對待它的方式不同,問題*就會消失。無論如何,我已經添加了通用選項。 –

1

因爲Python 3,你可以使用PEP 3132擴展拆包:

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

如果這不是一個選項,解開中間包y:

for handler in handlers: 
    (route, handler), kw = handler[:2], handler[2:] 
+0

您的解壓縮行失敗,並且ValueError:需要超過2個值才能解包,因爲右側有兩個值的元組。 –

+0

對不起,但這並不奏效:ValueError:需要超過2個值才能解包。我可以通過做(r,h)來解決,kw = h [:2],h [2:]但是kw本身就是一個元組(如(5,)或())。 – LetMeSOThat4U