在Python中获取仅限于函数作用域的局部字典
我总是遇到这样一种情况:我想用一个字典,这个字典和'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)