以下是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({})
第二次通话不是多余的吗?
答案 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()的连续调用都会在堆栈上推送一个额外的字典,因此第二次这样做是很有用的。