Um dos padrões de programação funcional que gosto e uso mais é a desestruturação do contêiner de sequência: quando você usa correspondência de padrões, por exemplo. (Haskell usa o açúcar sintático [x: xs]).
Destruição é apenas um nome chique para fatiar uma lista.
Na maioria das vezes, você o usa para ocupar o primeiro lugar na sua lista, e o resto aparece. E descobri que faltava no python (corrija-me se estiver errado) quando estava tentando fazer essas coisas:
commands = ([signal, key, value], ...)
for command in commands:
signal, args = **destructuring command**
Claro que eu poderia ter usado duas linhas como esta:
signal = command.pop(0)
args = command
Mas parecia importante para mim poder fazê-lo em uma linha e sem alterar o contêiner original. Então, aqui está meu snippet de desestruturação:
from collections import Sequence
def destructurate(container):
class DestructurationError(Exception):
pass
if isinstance(container, Sequence):
return container[0], container[1:]
else:
raise DestructurationError("Can't destructurate a non-sequence container")
Que no meu caso você pode usar como:
>>> signal, args = destructurate(command)
>>> signal
signal
>>> args
[key, value]