0

我一直在这种情况下结束,我想使用字典,非常像“本地人”返回的字典,但它只包含函数有限范围内的变量。有没有办法在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

4 回答 4

5

我不确定我是否同意制作字典违反 DRY,但如果您真的不想重复任何内容,您可以在视图顶部定义一个“上下文”字典并使用字典键而不是整个视图中的变量。

def my_view(request):
    context = {}
    context['items'] = Item.objects.all()
    context['anothervalue'] = context['items'][2].name
    return render_to_response('template.html', context)
于 2009-05-12T22:57:12.763 回答
4

传递字典如何违反 DRY?Django 是关于 DRY的,所以我怀疑它的标准行为会直接违反它。然而,无论哪种情况,我都使用django-annoying的修改版本来使整个事情变得更容易:

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

装饰器render_to负责处理请求上下文和所有好东西。效果很好。

如果这没有帮助,我建议改写你的问题。无论您想做什么,locals()都很少需要这样做,尤其是在 Django 的这种情况下。

于 2009-05-12T22:54:22.063 回答
2

你说你不喜欢使用 locals() 因为它是“浪费的”。浪费什么?我相信它返回的字典已经存在,它只是给你一个参考。而且即使它必须创建字典,这也是 Python 中优化程度最高的操作之一,所以不用担心。

您应该专注于最能表达您的意图的代码结构,并且出错的可能性最小。你所担心的浪费没什么好担心的。

于 2009-05-12T23:14:39.100 回答
2

虽然我同意许多其他受访者的观点,即传递其中一个locals()或完全指定的 dict{'var1':var1, 'var2': var2}很可能是可以的,但如果您特别想“子集”一个 dict,例如,locals()这也远非难,例如:

loc = locals()
return dict((k,loc[k]) for k in 'var1 var2'.split())
于 2009-05-13T09:02:09.997 回答