Получение локального словаря для области действия функции только в Python - PullRequest
0 голосов
/ 13 мая 2009

Я продолжаю сталкиваться с такой ситуацией, когда хочу использовать словарь, очень похожий на тот, который возвращает «местный», но он содержит только переменные в ограниченном объеме функции. Есть ли способ сделать это в 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 записей, которые мне действительно нужны.

Ответы [ 4 ]

5 голосов
/ 13 мая 2009

Я не уверен, что согласен с тем, что создание словаря является нарушением СУХОГО, но если вы действительно не хотите повторять что-либо вообще, вы можете просто определить «контекстный» словарь в верхней части представления и используйте ключи словаря вместо переменных во всем представлении.

def my_view(request):
    context = {}
    context['items'] = Item.objects.all()
    context['anothervalue'] = context['items'][2].name
    return render_to_response('template.html', context)
4 голосов
/ 13 мая 2009

Как передача словаря является нарушением СУХОГО? Django - это все о DRY , поэтому я сомневаюсь, что стандартное поведение его напрямую нарушит. Однако в любом случае я использую модифицированную версию django-раздражающая , чтобы упростить задачу:

@render_to('my_template.html')
def myview(request):
    # figure stuff out...
    return {'var1':'val1','var2','val2'}

Декоратор render_to заботится о контексте запроса и обо всем этом хорошем. Хорошо работает.

Если это не поможет, я предлагаю перефразировать ваш вопрос. Все, что вы хотите сделать, возиться с locals(), и это редко требуется, особенно в такой ситуации с Django.

2 голосов
/ 13 мая 2009

Хотя я согласен со многими другими респондентами в том, что прохождение либо locals(), либо полностью указанного диктата {'var1':var1, 'var2': var2}, скорее всего, хорошо, если вы специально хотите "подмножество", например, locals(), что тоже далеко не сложно, например:

loc = locals()
return dict((k,loc[k]) for k in 'var1 var2'.split())
2 голосов
/ 13 мая 2009

Вы говорите, что не любите использовать localals (), потому что это "расточительно". Расточительный из чего? Я считаю, что словарь, который он возвращает, уже существует, он просто дает вам ссылку на него. И даже если он должен создать словарь, это одна из самых высокооптимизированных операций в Python, поэтому не беспокойтесь об этом.

Вы должны сосредоточиться на структуре кода, которая наилучшим образом выражает ваше намерение, с наименьшим количеством возможных ошибок. Трата, о которой вы беспокоитесь, не о чем беспокоиться.

...