在Python中获取仅限于函数作用域的局部字典

0 投票
4 回答
1446 浏览
提问于 2025-04-15 11:33

我总是遇到这样一种情况:我想用一个字典,这个字典和'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个我实际上并不需要的条目。

4 个回答

2

你说你不喜欢用locals()是因为它“浪费”。那浪费了什么呢?我觉得它返回的字典已经存在了,只是给你一个引用而已。即使它需要创建这个字典,这也是Python中优化得非常好的操作,所以不用担心。

你应该关注的是用最能表达你意图的代码结构,并且尽量减少出错的可能性。你担心的浪费其实根本不需要担心。

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的时候。

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)

撰写回答