Этот выбор позволяет пользователю изменять объекты, но они становятся гораздо читабельнее, а дополнительная работа, выполняемая внутри PreparedRequest, позволяет исправить проблемы с регистром и использовать словарь вместо CookieJar (ищите оператор if isinstance()/else):
#
#… из файла models.py…
#
class PreparedRequest():
····#
····#…пропускаем все остальное…
····#
····def prepare_cookies(self, cookies):
········"""Подготавливает данные заданного HTTP cookie.
········Эта функция в итоге генерирует заголовок ''Cookie'' на основе
········предоставленных cookies с использованием cookielib. Из-за особенностей
········дизайна cookielib заголовок не будет сгенерирован повторно,
········если он уже существует. Это значит, что эта функция может быть
········вызвана всего один раз во время жизни объекта
········:class:'PreparedRequest '. Любые последующие вызовы
········''prepare_cookies'' не возымеют эффекта, если только заголовок "Cookie"
········не будет удален заранее."""
········if isinstance(cookies, cookielib.CookieJar):
············self._cookies = cookies
········else:
············self._cookies = cookiejar_from_dict(cookies)
········cookie_header = get_cookie_header(self._cookies, self)
········if cookie_header is not None:
············self.headers['Cookie'] = cookie_header
Эти детали могут показаться незначительными, но они позволяют создать интуитивно понятный API.
Примеры из стиля Requests
Примеры стиля из Requests демонстрируют использование множеств (по нашему мнению, о них незаслуженно забывают!), мы также взглянем на модуль requests.status_codes module — он задействуется для упрощения стиля остального кода и позволяет избежать применения жестко закодированных кодов состояния HTTP в остальных местах.
Множества и их арифметика (отличная питонская идиома)
Мы еще не приводили пример использования множеств в Python. Множества в Python ведут себя так же, как и множества в математике: вы можете выполнить операции вычитания, объединения (с помощью оператора ИЛИ) и пересечения (с помощью оператора И):
>>> s1 = set((7,6))
>>> s2 = set((8,7))
>>> s1
{6, 7}
>>> s2
{8, 7}
>>> s1 — s2 # разность множеств
{6}
>>> s1 | s2 # объединение множеств
{8, 6, 7}
>>> s1 & s2 # пересечение множеств
{7}
Рассмотрим пример работы с множествами, вы можете найти его в конце этой функции из файла cookies.py (рядом с пометкой
):
Спецификация **kwargs позволяет пользователю предоставить любой параметр с ключевым словом для cookie (или не предоставлять их вовсе).
Арифметика множеств! Питонская. Простая. Доступная в стандартной библиотеке. Для словаря функция set() формирует множество ключей.
Это отличный пример того, что разбиение длинной строки на две короткие более разумно. Дополнительная переменная err не нанесла никакого вреда.
Вызов result.update(kwargs) обновляет словарь result парами ключ/значение, содержащимися в словаре kwargs, заменяя существующие пары или создавая те пары, которых не было.
Здесь вызов метода bool() возвращает значение True, если объект верен (это значит, что его значение оценивается как True — в данном случае вызов bool(result['port']) оценивается как True, если значение не равно None и не является пустым контейнером).
Сигнатура для инициализации cookielib.Cookie представляет собой набор из 18 позиционных аргументов и одного аргумента с ключевым словом (rfc2109 по умолчанию считается равным False). Нам, как среднестатистическим пользователям, невозможно запомнить все значения и их позиции, поэтому Requests позволяет присваивать значения позиционным аргументам, основываясь на их имени, как в случае аргументов с ключевым словом, отправляя целый словарь.
Коды состояний (читаемость имеет значение)
Файл status_codes.py нужен только для того, чтобы создать объект, который может искать коды состояний по атрибуту. Мы сначала покажем определение словаря в файле status_codes.py, а затем — фрагмент кода файла sessions.py, в котором словарь используется.
Читать дальше