Embora minha resposta original tenha falhado o ponto (tentando resolver esse problema com a solução para acessar a chave na fábrica do padrão ), eu a refiz para propor uma solução real para a presente pergunta.
Aqui está:
class walkableDict(dict):
def walk(self, callback):
try:
for key in self:
self[key] = callback(self[key])
except TypeError:
return False
return True
Uso:
>>> d = walkableDict({ k1: v1, k2: v2 ... })
>>> d.walk(f)
A idéia é subclassificar o ditado original para fornecer a funcionalidade desejada: "mapear" uma função sobre todos os valores.
O ponto positivo é que esse dicionário pode ser usado para armazenar os dados originais como se fossem dict
, enquanto transforma qualquer dado sob solicitação com um retorno de chamada.
Obviamente, sinta-se à vontade para nomear a classe e a função da maneira que desejar (o nome escolhido nesta resposta é inspirado na array_walk()
função do PHP ).
Nota: Nem o bloco try
- except
nem as return
instruções são obrigatórias para a funcionalidade, elas existem para imitar ainda mais o comportamento do PHP array_walk
.
dict((k, f(v)) for k, v in mydict.iteritems())
, ou seja, sem colchetes, que impediria a criação de uma lista intermediária por meio de um gerador.