2009-05-12 1 views
0

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

+1

«вручную сделать словарь (в нарушении правил DRY« Что такое создание словаря с нарушением СУХОЙ? » –

+0

Я имею в виду эту конкретную ситуацию. Если вы объявляете переменные (var = blahblah), то несколько строк позже , делая {'var': var}, похоже, вы повторяете свое решение об именах.С четырьмя или пятью переменными он становится утомительным и беспорядочным. – Albinofrenchy

+0

Я не заметил. Во-первых, я не создаю много локальных переменных в своих функциях представления. Обычно только несколько. Если обработка сложная, я вытаскиваю ее из функции просмотра. Во-вторых, я часто загружаю словарь с контекстной информацией, которая не является частью функции просмотра, но создается только в словаре. Повторение обычно составляет только две или три вещи - объект, object_list, а иногда и ключ или два, вытащенные из запроса. –

ответ

5

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

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

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

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

render_to декоратор заботится о контексте запроса и все, что хороший материал. Работает хорошо.

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

+0

Я добавил разъяснение выше (код не работает в комментариях так хорошо); несмотря на то, что django-annoying выглядит очень круто, сегодня я хотел получить get_object_or_none. – Albinofrenchy

+0

+1: Я согласен, что это не является нарушением СУХОЙ вообще. Действительно, создавая сопоставление значений, специфичное для контекста шаблона, вы создаете нечто, которое еще не существует (т. Е. Отображение), поэтому вы ничего не повторяете. Часто элементы в контексте шаблона создаются специально для этого шаблона; вы всегда должны иметь возможность полностью переработать логику представления, но создать контекстный словарь, который всегда один и тот же, тем самым изолируя шаблон от других слоев приложения. Передача locals() в шаблон довольно опасна, особенно в проектах с несколькими разработчиками/разработчиками. –

+0

В общем случае Яррет, я согласен: это сопоставление должно соответствовать шаблону независимо от реализации представлений. Я думаю, что на практике возникают определенные ситуации, в которых локальный контекст функции и контекст шаблона одинаковы; и я хочу, чтобы выразить это. Я согласен, что передача local() in опасна, что является одной из причин, по которым я написал этот вопрос. – Albinofrenchy

2

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

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

+0

Я думаю, что его забота загрязняет сферу его шаблона связкой неиспользуемых переменных – Jiaaro

2

Хотя я согласен со многими другими респондентами, проходящими либо locals() или полностью указано ДИКТ {'var1':var1, 'var2': var2}, скорее всего, хорошо, если вы специально хотите «подмножество» а ДИКТ такого как locals() это далеко трудно либо, например:

loc = locals() 
return dict((k,loc[k]) for k in 'var1 var2'.split()) 
Смежные вопросы