Django模板和当地人的技巧

luc*_*luc 53 python django

django书籍提供了本地技巧,以避免键入一长串参数作为上下文字典http://www.djangobook.com/en/2.0/chapter04/

它向懒惰的程序员推荐这个,但指出了一些可能对性能产生影响的开销.

我想知道你们中的一些人是否在实际应用程序中使用本地技巧.你推荐它还是不好的做法?

Ale*_*lli 78

我不喜欢重复 - 我认为"干","不要重复自己",是一个关键的编程原则.因此,我确实locals()在类似的情况下使用过.Django模板渲染远非这种情况的唯一情况:一般情况是"接受dict的函数或运算符,但不介意dict是否包含额外的条目".(例如,Python中的普通字符串格式是另一种这样的情况).

但是,有一个反补贴原则:程序应该可以理解为可行的本地化方式 - 这有助于维护和重构(因为它不需要研究其他文件来检查哪些重构是可接受的).对于这种locals()情况,这表明,如果模板(或字符串格式等)是本地文字(这是一种罕见的情况,其中只有少数变量可能被使用,因此locals()不是一个巨大的胜利!),这是正常的,但是模板位于不同文件中的正常情况.

因此,locals()在大多数情况下,使用会严重妨碍重构.在Python的几乎所有情况下,局部变量及其名称可以作为局部重构的一部分自由更改,因为它们没有"外部可见"效果......但是使用locals()中断 - 突然之间你无法安全地重命名变量以不同的名称提供更好的清晰度,重构代码流以消除变量等的需要等,而不是每次都在研究单独的模板文件以检查是否可能不需要旧名称(并且可能编辑模板文件,这可能是非平凡的,例如,如果它以i18n/L10n的目的维护在几种不同的自然语言中).

因此,除了性能的次要问题之外,还存在强烈的压力,要求使用locals()"严重","生产"代码 - 代码需要长期维护,因此易于重构和本地化.所以,当我"编程最好,我知道如何",而不是"偷工减料"时,我知道我最好避免locals().

毕竟,您希望在呈现模板的上下文中具有的值不一定"自然地"可用作本地裸名称; 可能它们中的一些或许多是计算结果,列表或词典中的项目等.在这种情况下,locals()如果您只是将这些值累积到合适的字典中而不是将它们分配给本地裸名称,则更容易避免"偷工减料"的诱惑.

这不是最简单的权衡,因为两个好的原则(避免重复和具有良好的地方性)不可避免地会发生冲突 - 因此,这是一个好问题!并没有一个完全容易受到黑色或白色的尖锐回答,这就是为什么我试图扩展双方的原因.最后,我认为这是"风格"方面之一,建议编程团队采用团队统一风格的指导方针并坚持下去 - 至少它不需要一遍又一遍地做出决定.问题出现的时间,并产生一个更加同质(从而可维护)的代码库.[[我必须承认,这个特定的观点从来没有在我参加的团队的风格指导中明确提到过,尽管很多其他人都有! - )]]

  • +1有几个原因.如果您有一组默认的context_processors为您的所有视图提供一些标准值,那么我会立即遇到这种情况.如果你不小心覆盖其中一个具有明确传递给模板的值的那个,那就太糟了,但如果它是一个偶然的覆盖你就会把你的头发拉出来,因为有一个local()值,其名称是'来自上下文处理器的全局名称. (3认同)

小智 27

我经常想到做以下事情,但我不确定它是否真的有用.

class MyStruct(object):
     pass

def my_view(request, id):
    c = MyStruct()
    c.customer = ..
    c.invoice = ..
    c.date = ..
    return render_to_response('xxx,html',c.__dict__)
Run Code Online (Sandbox Code Playgroud)

  • 哦,我的上帝! - 这太棒了! (8认同)
  • 为什么不使用简单的字典? (3认同)
  • 无需定义虚拟类.``C =拉姆达:0``足以达到目的(函数是对象太). (3认同)
  • 因为使用简单的dict,你不能使用点符号.`c.date`看起来好于`c ['date']`. (2认同)

Dan*_*man 12

亲自,我不喜欢它.除了旧的Python格言"明确比隐含更好"之外,我可能没有理由倾向于我.我想知道我的模板到底发生了什么.