Получение локального словаря для области видимости функции только в Python
-
21-08-2019 - |
Вопрос
Я продолжаю сталкиваться с ситуацией, когда я хочу использовать словарь, очень похожий на тот, который выдает 'locals', но который содержит переменные только в ограниченной области действия функции.Есть ли способ сделать это на python?
Еще немного о том, почему я хочу это сделать:Я играю с Django, и когда я захожу, чтобы предоставить моим шаблонам контекст, я вынужден либо вручную создать словарь (в нарушение принципов DRY), либо передать locals(), который содержит гораздо больше записей, чем необходимо (расточительно).Возможно, есть что-то, чего мне не хватает в django, что облегчило бы необходимость решения на уровне python?
Чтобы Прояснить:
Итак, случай, с которым я сталкивался неоднократно, - это то, где у меня есть:
@render_to('my_template.html')
def myview(request):
var1 = #blahblah
var2 = #...
# do stuff with vars
return {'var1': val1,'var2':val2}
Поэтому вместо того, чтобы повторять эти переменные и соглашения об именовании, я сделаю:
@render_to('my_template.html')
def myview(request):
var1 = #blahblah
var2 = #...
# do stuff with vars
return locals()
Который я нахожу более чистым, но я знаю, что это немного неаккуратно, так как в locals () есть еще около 30 записей, чем мне действительно нужно.
Решение
Я не уверен, что согласен с тем, что создание словаря является нарушением DRY, но если вы действительно не хотите вообще ничего повторять, вы могли бы просто определить контекстный словарь в верхней части представления и использовать ключи словаря вместо переменных во всем представлении.
def my_view(request):
context = {}
context['items'] = Item.objects.all()
context['anothervalue'] = context['items'][2].name
return render_to_response('template.html', context)
Другие советы
Каким образом передача словаря является нарушением DRY? Джанго - это все о СУХОСТИ, поэтому я сомневаюсь, что стандартное поведение it напрямую нарушило бы его.Однако в любом случае я использую модифицированную версию джанго-раздражающий чтобы сделать все это проще:
@render_to('my_template.html')
def myview(request):
# figure stuff out...
return {'var1':'val1','var2','val2'}
В render_to
декоратор заботится о контексте запроса и обо всем таком хорошем.Работает хорошо.
Если это не поможет, я предлагаю перефразировать ваш вопрос.Все, что ты хочешь делать , возясь с locals()
а такое редко бывает необходимо, особенно в подобной ситуации с Django.
Вы говорите, что вам не нравится использовать locals(), потому что это "расточительно".Расточительный в чем?Я полагаю, что словарь, который он возвращает, уже существует, он просто дает вам ссылку на него.И даже если для этого придется создать словарь, это одна из самых высокооптимизированных операций в Python, так что не беспокойтесь об этом.
Вы должны сосредоточиться на структуре кода, которая наилучшим образом выражает ваше намерение, с наименьшей вероятностью ошибки.Отходы, о которых вы беспокоитесь, - это не о чем беспокоиться.
Хотя я согласен со многими другими респондентами в том, что прохождение либо locals()
или полностью определенный диктант {'var1':var1, 'var2': var2}
скорее всего, это нормально, если вы специально хотите "подмножество" dict, такое как locals()
это тоже далеко не сложно, например:
loc = locals()
return dict((k,loc[k]) for k in 'var1 var2'.split())