Obtendo dicionário local para o escopo função apenas em Python
-
21-08-2019 - |
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.
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
Como está passando um dicionário uma violação da seca? Django é tudo sobre DRY , por isso duvido que o comportamento padrão de violaria-lo diretamente. Em ambos os casos, no entanto, eu uso uma versão modificada do django-irritante para fazer a coisa toda mais fácil:
@render_to('my_template.html')
def myview(request):
# figure stuff out...
return {'var1':'val1','var2','val2'}
O decorador render_to
cuida do contexto de solicitação e todas essas coisas boas. Funciona bem.
Se isso não ajudar, sugiro reformular a sua pergunta. Tudo o que você quer fazer brincando com locals()
e tal raramente é necessário, especialmente neste tipo de situação com Django.
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())