Книга «Секреты Python Pro»

0 24

Книга «Секреты Python Pro»

Книга «Секреты Python Pro» научит проектировать ПО и писать качественный код, то есть делать его понятным, сопровождаемым и расширяемым.

Дейн Хиллард — профессиональный питонист, — с помощью примеров и упражнений он покажет вам как разбивать код на блоки, повышать качество за счет снижения сложности и т. д. Только освоив основополагающие принципы, вы сможете сделать так, чтобы чтение, сопровождение и переиспользование вашего кода не доставляло проблем ни вам ни вашим коллегам.

Книга «Секреты 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 Pro»

    Каждый модуль имеет глобальное пространство имен, к которому код в модуле может свободно обращаться. Ни во что не вложенные функции, классы и переменные находятся в глобальном пространстве имен модуля:

    Книга «Секреты Python Pro»

    Функции и классы в модуле также имеют локальное пространство имен, обращаться к которому могут только они:

    Книга «Секреты Python Pro»

    Модуль, который хочет использовать переменную, функцию или класс из другого модуля, должен импортировать их в свое глобальное пространство имен. Импортирование — это перемещение имени в нужное пространство имен из другой части кода.

    Книга «Секреты Python Pro»

    Таким образом, для того чтобы ссылаться на переменную, функцию или класс в Python, одно из следующих утверждений должно быть истинным:

  • Это имя находится во встроенном в Python пространстве имен.
  • Имя находится в глобальном пространстве имен текущего модуля.
  • Имя находится в текущей кодовой строке локального пространства имен.
  • Приоритет для конфликтующих имен работает в обратном порядке: локальное имя будет переопределять глобальное имя, которое будет переопределять встроенное имя. Запомните, что наиболее специфичным для текущего кода является определение, которое используется сейчас (рис. 2.1).

    Книга «Секреты Python Pro»

    Возможно, вы встречали ошибку NameError: name ‘my_var’ is not defined1. Она означает, что имя my_var не найдено ни в одном из пространств имен, известных коду. То есть, скорее всего, вы ни разу не передавали переменной my_var значение либо передали его где-то еще и должны его импортировать.

    Модули представляют собой отличный способ начать дробить код. Если у вас есть один длинный файл script.py с кучей несвязанных функций в нем, попробуйте разбить эти функции на модули.

    С полным содержанием статьи можно ознакомиться на сайте «Хабрахабр»:

    https://habr.com/ru/company/piter/blog/540346/

    Источник

    Оставьте ответ