Pergunta

Eu mantenho acabar com esta situação onde eu quero usar um dicionário muito parecido com os 'moradores se dá de volta, mas que contém apenas as variáveis ??no âmbito limitado da função. Existe uma maneira de fazer isso em python?

Um pouco mais sobre por que eu quero fazer isso: eu estou jogando com Django e quando eu vou dar o meu contexto de modelos, estou forçados a manualmente fazer um dicionário (em violação aos princípios seco) ou passar em locals são necessários () que contém muito mais entradas então (desperdício). Existe talvez algo que eu estou faltando com o Django que aliviaria a necessidade de uma solução de nível python?

Para esclarecer:

Assim, o caso que eu bater repetidamente é onde eu tenho:

@render_to('my_template.html') 
def myview(request): 
    var1 = #blahblah 
    var2 = #... 
    # do stuff with vars 
    return {'var1': val1,'var2':val2} 

Então, ao invés de repetir essas variáveis ??e convenções de nomenclatura, eu vou fazer:

@render_to('my_template.html') 
def myview(request): 
    var1 = #blahblah 
    var2 = #... 
    # do stuff with vars 
    return locals() 

O que eu acho mais limpo, mas eu sei que tipo de desleixado uma vez que existem cerca de mais 30 entradas em locais (), então eu realmente precisa.

Foi útil?

Solução

Eu não tenho certeza eu concordo que fazer um dicionário é uma violação da seca, mas se você realmente não quer repetir alguma coisa, você poderia apenas definir um dicionário 'contexto' na parte superior da vista e usar dicionário chaves em vez de variáveis ??ao longo do ponto de vista.

def my_view(request):
    context = {}
    context['items'] = Item.objects.all()
    context['anothervalue'] = context['items'][2].name
    return render_to_response('template.html', context)

Outras dicas

Você diz que não gosta de usar locals () porque ele é "um desperdício". Desperdício de quê? Eu acredito que o dicionário já retorna existe, é apenas o que lhe dá uma referência a ele. E mesmo se ele tem para criar o dicionário, esta é uma das operações mais altamente otimizado em Python, então não se preocupe com isso.

Você deve se concentrar na estrutura de código que melhor expressa a sua intenção, com o menor número de possibilidades de erro. O lixo que você está preocupado é nada para se preocupar.

Embora concorde com muitos outros entrevistados que passar tanto locals() ou um {'var1':var1, 'var2': var2} dict totalmente especificado é mais provável OK, se você quiser especificamente para "subconjunto" um dicionário como locals() que está longe de ser rígido, quer, por exemplo:.

loc = locals()
return dict((k,loc[k]) for k in 'var1 var2'.split())
scroll top