Новости
05.02.2021
Книга «Секреты Python Pro» научит проектировать ПО и писать качественный код, то есть делать его понятным, сопровождаемым и расширяемым.
Дейн Хиллард — профессиональный питонист, — с помощью примеров и упражнений он покажет вам как разбивать код на блоки, повышать качество за счет снижения сложности и т. д. Только освоив основополагающие принципы, вы сможете сделать так, чтобы чтение, сопровождение и переиспользование вашего кода не доставляло проблем ни вам ни вашим коллегам.
Разделение ответственности
В этой главе:
- Использование средств Python для организации и разделения кода.
- Выбор способа и времени разделения кода на четко различимые фрагменты.
- Уровни гранулярности в разделении кода.
Краеугольным камнем чистого кода является разделение разнообразных форм его поведения на малые управляемые отрезки. Чистый код подразумевает, что вы не держите в голове всю связанную с ним информацию, когда обсуждаете его. Короткие отрезки кода с четко выраженными намерениями являются большим шагом в верном направлении, но эти отрезки не должны разбиваться произвольно. Необходимо разделить их по зонам ответственности.
Определение
Зоной ответственности (concern) я называю совокупность правил отдельной области знаний, с которой имеет дело ПО. Эти правила могут варьироваться по сложности от вычисления квадратного корня до управления платежами в системе электронной коммерции.
В этой главе я расскажу об инструментах, встроенных в Python для разделения ответственности в вашем коде, а также о философии, которая помогает принимать решения, как и когда их использовать.
Примечание
Если вы еще не установили Python на своем компьютере, то сделайте это, чтобы отслеживать код из книги (рекомендации по установке — в приложении в конце книги). Я подожду вас здесь. Получить полный исходный код примеров и упражнений можно в репозитории книги на GitHub (https://github.com/daneah/practices-of-the-python-pro).
2.1. Организация пространства имён
Как и многие языки программирования, Python разделяет фрагменты кода с помощью пространств имен. При выполнении программы он отслеживает все известные пространства имен и информацию, доступную в них.
Пространства имен полезны в нескольких отношениях:
- По мере роста ПО несколько понятий будут нуждаться в одинаковых или идентичных именах. Пространства имен помогают снизить неопределенность и сохранить ясность, к какому понятию имя относится.
- По мере роста ПО становится экспоненциально труднее узнавать, какой код уже присутствует в кодовой базе. Пространства имен помогают делать обоснованные догадки о том, где может располагаться код, если он уже существует.
- При добавлении нового кода в крупную кодовую базу существующие пространства имен могут указывать на его соответствие старым или новому пространствам имен.
Пространства имен настолько важны, что они включены в «Дзен языка Python» в качестве последнего утверждения (если вы не знакомы с Дзеном, то попробуйте запустить интерпретатор Python и набрать import this).
Пространства имен — отличная штука! Будем делать их больше!
Дзен языка Python
Имена всех переменных, функций и классов, которые вы когда-либо использовали в Python, находились в том или ином пространстве имен. Имена, такие как x, total или EssentialBusinessDomainObject, являются ссылками на что-то. x = 3 означает «назначить значение 3 имени x», то есть можно в дальнешем ссылаться на x. Так называемая «переменная» — это имя, которое ссылается на значение, хотя в Python имена могут ссылаться на функции, классы и др.
2.1.1. Пространства имен и инструкция import
Когда вы впервые открываете интерпретатор Python, встроенное пространство имен заполняется встроенной начинкой, например функциями без префикса, такими как print() и open(), которые можно сразу использовать в любом месте кода. Вот почему в Python знаменитая легкая инструкция print('Здравствуй, мир!') стала мемом Just Works (просто работает).
В отличие от других языков, в Python не нужно явно создавать пространства имен, но ваша структура кода повлияет на то, какие пространства имен создаются и как они будут взаимодействовать. Так, при создании модуля для него автоматически будет создано отдельное пространство имен. В самом простом случае модулем является файл .py, содержащий некоторый код. Файл с именем sales_tax.py, например, является модулем sales_tax:
Каждый модуль имеет глобальное пространство имен, к которому код в модуле может свободно обращаться. Ни во что не вложенные функции, классы и переменные находятся в глобальном пространстве имен модуля:
Функции и классы в модуле также имеют локальное пространство имен, обращаться к которому могут только они:
Модуль, который хочет использовать переменную, функцию или класс из другого модуля, должен импортировать их в свое глобальное пространство имен. Импортирование — это перемещение имени в нужное пространство имен из другой части кода.
Таким образом, для того чтобы ссылаться на переменную, функцию или класс в Python, одно из следующих утверждений должно быть истинным:
- Это имя находится во встроенном в Python пространстве имен.
- Имя находится в глобальном пространстве имен текущего модуля.
- Имя находится в текущей кодовой строке локального пространства имен.
Приоритет для конфликтующих имен работает в обратном порядке: локальное имя будет переопределять глобальное имя, которое будет переопределять встроенное имя. Запомните, что наиболее специфичным для текущего кода является определение, которое используется сейчас (рис. 2.1).
Возможно, вы встречали ошибку NameError: name 'my_var' is not defined1. Она означает, что имя my_var не найдено ни в одном из пространств имен, известных коду. То есть, скорее всего, вы ни разу не передавали переменной my_var значение либо передали его где-то еще и должны его импортировать.
Модули представляют собой отличный способ начать дробить код. Если у вас есть один длинный файл script.py с кучей несвязанных функций в нем, попробуйте разбить эти функции на модули.
С полным содержанием статьи можно ознакомиться на сайте "Хабрахабр":
Комментарии: 0
Пока нет комментариев