Читаем Автостопом по Python полностью

Tox (https://tox.readthedocs.io/) — инструмент командной строки, который использует виртуальные среды для запуска тестов. Вы можете запускать их на своем компьютере (tox в командной строке), если установлены интерпретаторы Python. Интегрирован с GitHub, поэтому, если у вас есть файл tox.ini на высшем уровне репозитория, как у Werkzeug, он автоматически будет запускать тесты при каждом коммите.

Рассмотрим конфигурационный файл Werkzeug tox.ini целиком:

[tox]

envlist = py{26,27,py,33,34,35}-normal, py{26,27,33,34,35}-uwsgi

[testenv]

passenv = LANG

deps=

# General

pyopenssl

greenlet

pytest

pytest-xprocess

redis

requests

watchdog

uwsgi: uwsgi

# Python 2

py26: python-memcached

py27: python-memcached

pypy: python-memcached

# Python 3

py33: python3-memcached

py34: python3-memcached

py35: python3-memcached

whitelist_externals=

redis-server

memcached

uwsgi

commands=

normal: py.test []

uwsgi: uwsgi

--pyrun {envbindir}/py.test

--pyargv -kUWSGI --cache2=name=werkzeugtest,items=20 --master


Примеры стиля из Werkzeug

В главе 4 мы уже рассмотрели большую часть принятых соглашений по стилю. Первый пример стиля в этом разделе демонстрирует элегантный способ угадать типы на основе строки, второй показывает, что вы можете использовать параметр VERBOSE при определении длинных регулярных выражений, поэтому другие пользователи смогут понять, что делает выражение, не затратив на это много времени.


Элегантный способ угадать тип (если реализацию легко объяснить — идея, возможно, хороша)

Вам, скорее всего, приходилось анализировать текстовые файлы и преобразовывать содержимое к разным типам. Это решение выглядит особенно питонским, поэтому мы включили его в книгу.

Поиск в словарях с помощью ключей в Python использует соотнесение хэшей, как и поиск в множестве. Python не имеет операторов switch case. (Их отклонили как непопулярные в PEP 3103 (https://www.python.orgdevpeps/pep-3103/).) Вместо этого пользователи Python используют инструкцию if/elif/else или (как показано здесь) питонское решение — поиск в словаре.

Обратите внимание, что в первый раз попытка преобразования выполняется к более ограниченному типу int, перед тем как попытаться выполнить преобразование к типу float.

Питонским решением также является использование оператора try/except для infer type.

Эта часть необходима, поскольку код находится в файле werkzeug/routing.py, а анализируемая строка является частью URL. Здесь проверяется наличие кавычек, при обнаружении они удаляются.

text_type преобразовывает строки в формат Unicode таким образом, что они остаются совместимыми и с Python 2, и с Python 3. Этот код практически аналогичен функции u(), показанной в разделе «HowDoI» в начале главы 5.


Регулярные выражения (читаемость имеет значение)

Если вы используете в своем коде длинные регулярные выражения, не забывайте про параметр re.VERBOSE69 — сделайте их более понятными для других людей. Пример регулярных выражений показан во фрагменте файла werkzeug/routing.py: import re

rulere = re.compile(r'''

(?P[^<]*) # static rule data

<

(?:

(?P[a-zA-Z_][a-zA-Z0-9_]*) # имя преобразователя

(?:\((?P.*?)\))? # аргументы преобразователя

\: # разделитель переменных

)?

(?P[a-zA-Z_][a-zA-Z0-9_]*) # имя переменной

>

''', re.VERBOSE)


Примеры структуры из Werkzeug

В первых двух примерах, связанных со структурой, демонстрируются питонские способы использования динамической типизации. Мы предупреждали, что присваивание переменной разных значений может приводить к появлению проблем (см. подраздел «Динамическая типизация» раздела «Структурируем проект» главы 4), но не упомянули преимущества такого присваивания. Одно из них заключается в том, что вы можете использовать любой тип объекта, который ведет себя предсказуемо. Это называется утиной типизацией. Утиная типизация исповедует следующую философию: «Если что-то выглядит, как утка70, крякает, как утка, то это и есть утка».

В обоих примерах используется возможность вызвать объекты, которые не являются функциями: вызов cached_property.__init__() позволяет проинициализировать экземпляры класса, чтобы их можно быть применять как обычные функции, а вызов Response.__call__() позволяет объекту класса Response вызвать как функцию самого себя.

В последнем фрагменте используется реализация некоторых классов-примесей (каждый из них определяет какую-либо функциональность в объекте класса Request), характерная для Werkzeug, чтобы продемонстрировать, что такие классы — это тоже отличная штука.


Перейти на страницу:

Похожие книги

Из жизни попаданцев
Из жизни попаданцев

Уважаемые читатели! Этот фанфик не пропагандирует идеи национал-социализма и идеалы СС. Автор считает, что лучше всего в непривычный мир может вписаться разведчик или диверсант. Учитывая начало фика, лучшим кандидатом на роль главного героя оказался немец. Автор много читал про диверсантов времен ВМВ. Образ главного героя собирательный, автор использовал факты биографии некоторых друзей и подчиненных Отто Скорцени. Если по каким-либо причинам такой главный герой является для вас неприемлемым, то, убедительная просьба, ПРОСТО НЕ ЧИТАЙТЕ.Ну, а для тех, кто всё-таки решился... В 1945 году Дамблдор и Гриндевальд проводили некий ритуал. Ритуал сорвал офицер СС… «Внизу у лестницы обнаружился еще один труп. Его унесли вместе с трупом красноглазого. Насколько я понял, это был хозяин дома и муж Лили, а также отец маленького Гарри, некий Джеймс Поттер. Честно говоря, я даже обрадовался этому обстоятельству. Во-первых, муж точно заметил бы, что с женой что-то не так, а во-вторых, только мужа мне и не хватало. В-третьих, в гостиной обнаружилась газета со странными движущимися картинками. А на газете была дата… 31 октября 1981 года…»Да-да, мать маленького Гарри осталась жива. Чудом уцелела. Вот, только...

Алексей Бухтояров , Заязочка , Заязочка

Неотсортированное / Фанфик / Попаданцы