为什么在RequestContext .__ init__中使用空dict连续调用更新?

时间:2017-07-30 05:41:10

标签: python django dictionary

以下是await

__init__方法的实现
RequestContext

如您所见,它连续调用def __init__(self, request, dict_=None, processors=None, use_l10n=None, use_tz=None, autoescape=True): super(RequestContext, self).__init__( dict_, use_l10n=use_l10n, use_tz=use_tz, autoescape=autoescape) self.request = request self._processors = () if processors is None else tuple(processors) self._processors_index = len(self.dicts) # placeholder for context processors output self.update({}) # empty dict for any new modifications # (so that context processors don't overwrite them) self.update({}) 而两者之间没有任何操作。

虽然每次调用之前的评论都提到了它正在做的事情,但我仍然没有看到差异,因为没有评论,它看起来像这样:

self.update({})

第二次通话不是多余的吗?

1 个答案:

答案 0 :(得分:4)

摘要

update()方法在字典堆栈上推送新的dict。这意味着两个 update 调用将推送两个词典。

正如评论所解释的那样,推送的第一个dict是上下文处理器输出的占位符,第二个dict推送隔离了堆栈其余部分的任何修改。

详细

如果您查看source code

,这会更容易理解
def update(self, other_dict):
        "Pushes other_dict to the stack of dictionaries in the Context"
        if not hasattr(other_dict, '__getitem__'):
            raise TypeError('other_dict must be a mapping (dictionary-like) object.')
        if isinstance(other_dict, BaseContext):
            other_dict = other_dict.dicts[1:].pop()
        return ContextDict(self, other_dict)

核心问题

我认为混淆的一点是常规 dict.update()idempotent,所以第二次这样做是没有意义的。相反,每次对 Context.update()的连续调用都会在堆栈上推送一个额外的字典,因此第二次这样做是很有用的。