Зачем копировать dictonairy из среды WSGI? - PullRequest
2 голосов
/ 06 сентября 2010

В следующем примере с wsgi.org скопировано cur_named:

def __call__(self, environ, start_response):
    script_name = environ.get('SCRIPT_NAME', '')
    path_info = environ.get('PATH_INFO', '')
    for regex, application in self.patterns:
        match = regex.match(path_info)
        if not match:
            continue
        extra_path_info = path_info[match.end():]
        if extra_path_info and not extra_path_info.startswith('/'):
            # Not a very good match
            continue
        pos_args = match.groups()
        named_args = match.groupdict()
        cur_pos, cur_named = environ.get('wsgiorg.routing_args', ((), {}))
        new_pos = list(cur_pos) + list(pos_args)
        new_named = cur_named.copy() # Why copy()?
        new_named.update(named_args)
        environ['wsgiorg.routing_args'] = (new_pos, new_named)
        environ['SCRIPT_NAME'] = script_name + path_info[:match.end()]
        environ['PATH_INFO'] = extra_path_info
        return application(environ, start_response)
    return self.not_found(environ, start_response)

Почему бы не позвонить ur_named.update(named_args) напрямую?

1 Ответ

1 голос
/ 06 сентября 2010

Знаете ли вы, откуда cur_named появился дикт? Просто представьте что-то вроде следующего:

SOME_CONFIG = {
    'some_key': ((..., ...), {...}),
    ...
}

environ['wsgiorg.routing_args'] = SOME_CONFIG['some_key']

Теперь, когда вы обновляете new_named на месте, вы фактически обновляете внутренний словарь внутри SOME_CONFIG, который приведет ваши данные к другим запросам. Безопасный способ - скопировать словарь, если вы не уверены, что он не нужен.

...