Таня Шлюссер - Автостопом по Python
- Название:Автостопом по Python
- Автор:
- Жанр:
- Издательство:Питер
- Год:2017
- Город:СПб.
- ISBN:978-5-496-03023-6
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Таня Шлюссер - Автостопом по Python краткое содержание
и содержит наработки многочисленных профессионалов и энтузиастов, знающих, что такое Python, и чего вы от него хотите. Проверенные методы и новейшие приемы, собранные в этой книге, помогут вам стать профессиональным Python-программистом и во всеоружии встретить наступающую эпоху Python 3.
Автостопом по Python - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Обычно вам не следует об этом беспокоиться: обратите внимание, что свойство __slots__ не появляется в классах Dataset или Databook — только в классе Row, но поскольку рядов данных может быть очень много, использование __slots__ выглядит хорошим решением. Класс Row не показан в tablib/__init__.py, поскольку является вспомогательным классом для класса Dataset, для каждой строки создается один объект такого класса.
Рассмотрим, как выглядит определение __slots__ в самом начале определения класса Row:
class Row(object):
····"""Внутренний объект Row. Используется в основном для фильтрации."""
····__slots__ = ['_row', 'tags']
····def __init__(self, row=list(), tags=list()):
········self._row = list(row)
········self.tags = list(tags)
····#
····#… и т. д…
····#
Проблема в том, что больше не существует атрибута __dict__, в котором хранятся объекты класса Row, но функция pickle.dump() (вызывается для сериализации объектов) по умолчанию использует __dict__ для сериализации объектов, если только не определен метод __getstate__(). Аналогично во время десериализации (процесса, который читает сериализованные байты и восстанавливает объект в памяти), если метод __setstate__() не определен, метод pickle.load() загружает данные в атрибут объекта __dict__. Рассмотрим, как это обойти.
class Row(object):
····#
····#… пропускаем другие определения…
····#
····def __getstate__(self):
········slots = dict()
········for slot in self.__slots__:
············attribute = getattr(self, slot)
············slots[slot] = attribute
········return slots
····def __setstate__(self, state):
········for (k, v) in list(state.items()):
············setattr(self, k, v)
Для получения более подробной информации о методах __getstate__() и __setstate__() и сериализации обратитесь к документации __getstate__ ( http://bit.ly/__getstate__-doc).
Примеры из стиля Tablib
Мы подготовили лишь один пример использования стиля в Tablib — перегрузка операторов (это позволяет рассмотреть детали модели данных Python). Настройка поведения ваших классов позволит разработчикам, использующим ваш API, писать хороший код.
Перегрузка операторов (красивое лучше, чем уродливое).В этом фрагменте кода приводится перегрузка операторов Python, чтобы выполнять операции для строк или столбцов набора данных. В первом фрагменте кода показывается интерактивное применение квадратных скобок [] как для численных индексов, так и для имен столбцов, а во втором — код, который использует это поведение.


Если вы указываете в квадратных скобках числа, этот оператор вернет строку, которая находится в заданной позиции.
Благодаря этому оператору присваивания с квадратными скобками…
… вместо исходной одной оливки у вас становится две.
Здесь выполняется удаление с помощью вырезки — 2:7 указывает на числа 2, 3, 4, 5, 6, но не 7.
Взгляните, насколько сокращается рецепт после выполнения.
Вы также можете получить доступ к столбцам с помощью имени.
В части кода класса Dataset, которая определяет поведение оператора «квадратные скобки», показывается, как обрабатывать доступ по имени столбца и номеру строки.


Во-первых, проверим, что именно мы ищем — столбец (True, если key является строкой) или строку (True, если key является числом или вырезкой).
Этот код проверяет наличие ключа в self.headers и затем…
…явно вызывает исключение KeyError, поэтому, если вы получаете доступ по имени столбца, поведение будет таким же, как и у словаря. Весь блок if/else необязателен для работы функции — если его опустить, исключение ValueError будет сгенерировано функцией self.headers.index(key) в том случае, если ключа нет в self.headers. Единственным его предназначением является предоставление пользователю библиотеки более информативной ошибки.
Здесь определяется, чем является ключ — числом или вырезкой (вроде 2:7). Если вырезкой, _results будет списком, а не объектом класса Row.
Здесь обрабатывается вырезка. Поскольку строки возвращаются как кортежи, значения представляют собой неизменяемые копии реальных данных — и данные из набора (которые хранятся в списках) не будут случайно повреждены в результате присваивания.
Метод __setitem__() может изменить одну строку, но не столбец. Это сделано намеренно, так как не существует способа изменить содержимое всего столбца; с точки зрения целостности данных такое решение не самый плохой выбор. Пользователь всегда может преобразовать столбец и внедрить его в любую позицию с помощью одного из методов insert_col(), lpush_col() или rpush_col().
Метод __delitem__() удалит столбец или строку, используя ту же логику, что и метод __getitem__().
Для получения более подробной информации о перегрузке операторов и других особых методах смотрите документацию Python о специальных именах методов ( http://bit.ly/special-method-names).
Requests
В День святого Валентина в 2011 году Кеннет Ритц (Kenneth Reitz) опубликовал «любовное письмо», адресованное сообществу Python, — библиотеку Requests. Она была воспринята с большим энтузиазмом благодаря интуитивно понятному дизайну API (это значит, что API настолько прост и понятен, что вам почти не нужна документация для того, чтобы им пользоваться).
Читаем более крупную библиотеку
Библиотека Requests намного крупнее библиотеки Tablib и имеет множество модулей. Однако мы подходим к вопросу ее прочтения точно так же — просмотрим документацию и будем следовать API в коде.
Загрузите Requests из GitHub:
$ git clone https://github.com/kennethreitz/requests.git
$ virtualenv — p python3 venv
$ source venv/bin/activate
(venv)$ cd requests
(venv)$ pip install — editable.
(venv)$ pip install — r requirements.txt # Required for unit tests
Интервал:
Закладка: