Há muitas situações em que uma função faz cálculos e operações para obter valores e, ao final, deve montar uma string com esses valores. Nesta situação, muita gente monta um dicionário com os valores e usa string formatting para gerar a string a ser retornada. Por exemplo:
# -*- encoding: utf-8 -*- import string,random template='''Sugestões para %(nome)s: - login: %(login)s - email: %(email)s - site: www.%(domain)s.com - senha: %(passwd)s ''' def sugere_logins(nome): login=nome.split(' ')[0].lower() domain=nome.split(' ')[-1].lower() email=login+'@'+domain+'.com' chars=string.letters+string.digits passwd=''.join(random.sample(chars,10)) dados={'login':login, 'email':email, 'nome':nome, 'domain':domain, 'passwd':passwd} print template % dados
Você pode substituir todo o trecho em que monta o dicionário, usando o resultado da função locals(). A função locals() retorna um dicionário com todas as variáveis locais. No exemplo acima, isso ficaria assim:
# -*- encoding: utf-8 -*- import string,random template='''Sugestões para %(nome)s: - login: %(login)s - email: %(email)s - site: www.%(domain)s.com - senha: %(passwd)s ''' def sugere_logins(nome): login=nome.split(' ')[0].lower() domain=nome.split(' ')[-1].lower() email=login+'@'+domain+'.com' chars=string.letters+string.digits passwd=''.join(random.sample(chars,10)) print template % locals()
Uso muito esse truque ao trabalhar com web2py, fazendo com que os controllers, ao invés de retornar um dicionário montado por mim, retornem locals().
Aliás, precisa do meu_locals sim. hehehe
No meu comentário anterior, a atribuição ao meu_locals não precisa. Eu estava com outro código em mente antes, e acabei esquecendo o gaiato ali. #fail rsrsrs
Formatar strings com locals() (ou qualquer outro dicionário com muitas chaves) é bem útil e economiza código. 😉
Eu só não recomendaria a parte do return locals() p/ um template se a função usar muitas variáveis. Isso só é bom na hora de escrever o código. Depois, quem vai dar manutenção sofre pra descobrir se determinada variável é usada no template. Principalmente se houver inclusão de outro template, por exemplo.
Para economizar código, a partir do Python 2.7, é possível usar dict_comprehension para deixar o antigo return locals() mais explícito, assim:
>>> meu_locals = locals()
>>> return {key: meu_locals.get(key) for key in ‘campo1 campo2 campo3’.split()}
Antes da v2.7 também era possível retornando tuplas e criando o dicionário com dict(), assim:
>>> return dict([(key, meu_locals.get(key)) for key in ‘campo1 campo2 campo3’.split()])
Mas, claro, se sua função usar poucas variáveis, até que o return locals() ajuda, né? 😉