Получение локального словаря для области видимости функции только в Python

StackOverflow https://stackoverflow.com/questions/855259

Вопрос

Я продолжаю сталкиваться с ситуацией, когда я хочу использовать словарь, очень похожий на тот, который выдает '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())
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top