Структура программы на питоне

Содержание

Python отличается от таких языков программирования, как C# или Java, заставляющих программиста давать классам имена, соответствующие именам файлов, в которых находится код этих классов.

Python — это самый гибкий язык программирования из тех, с которыми мне приходилось сталкиваться. А когда имеешь дело с чем-то «слишком гибким» — возрастает вероятность принятия неправильных решений.

  • Хотите держать все классы проекта в единственном файле main.py ? Да, это возможно.
  • Надо читать переменную окружения? Берите и читайте там, где это нужно.
  • Требуется модифицировать поведение функции? Почему бы не прибегнуть к декоратору!?

Применение многих идей, которые легко реализовать, может привести к негативным последствиям, к появлению кода, который очень тяжело поддерживать.

Но, если вы точно знаете о том, что делаете, последствия гибкости Python не обязательно окажутся плохими.

СДЕЛАЙ СВОЮ ЗМЕЙКУ НА ПИТОНЕ ЗА 30 СЕКУНД / СВОЯ ИГРА НА HTML / ВЕБ РАЗРАБОТКА ЛЕГКО

Здесь я собираюсь представить вашему вниманию рекомендации по организации Python-кода, которые сослужили мне хорошую службу, когда я работал в разных компаниях и взаимодействовал со многими людьми.

Структура Python-проекта

Сначала обратим внимание на структуру директорий проекта, на именование файлов и организацию модулей.

Рекомендую держать все файлы модулей в директории src , а тесты — в поддиректории tests этой директории:

├── src │ ├── /* │ │ ├── __init__.py │ │ └── many_files.py │ │ │ └── tests/* │ └── many_tests.py │ ├── .gitignore ├── pyproject.toml └── README.md

Здесь — это главный модуль проекта. Если вы не знаете точно — какой именно модуль у вас главный — подумайте о том, что пользователи проекта будут устанавливать командой pip install , и о том, как, по вашему мнению, должна выглядеть команда import для вашего модуля.

Часто имя главного модуля совпадает с именем всего проекта. Но это — не некое жёсткое правило.

Аргументы в пользу директории src

Я видел множество проектов, устроенных по-другому.

Например, в проекте может отсутствовать директория src , а все модули будут просто лежать в его корневой директории:

non_recommended_project ├── /* │ ├── __init__.py │ └── many_files.py │ ├── .gitignore │ ├── tests/* │ └── many_tests.py │ ├── pyproject.toml │ ├── /* │ ├── __init__.py │ └── many_files.py │ └── README.md

Уныло смотрится проект, в структуре которого нет никакого порядка из-за того, что его папки и файлы просто расположены по алфавиту, в соответствии с правилами сортировки объектов в IDE.

Главная причина, по которой рекомендуется пользоваться папкой src , заключается в том, чтобы активный код проекта был бы собран в одной директории, а настройки, параметры CI/CD, метаданные проекта находились бы за пределами этой директории.

Единственный минус такого подхода заключается в том, что, без дополнительных усилий, не получится воспользоваться в своём коде командой вида import module_a . Для этого потребуется кое-что сделать. Ниже мы поговорим о том, как решить эту проблему.

#Архитектура приложения и кода

Именование файлов

Правило №1: тут нет файлов

Во-первых — в Python нет таких сущностей, как «файлы», и я заметил, что это — главный источник путаницы для новичков.

Читайте также:
Какие программы открывают формат svg

Если вы находитесь в директории, содержащей файл __init__.py , то это — директория, включающая в себя модули, а не файлы.

Рассматривайте каждый модуль, как пространство имён.

Я говорю о «пространстве имён», так как нельзя сказать с уверенностью — имеется ли в модуле множество функций и классов, или только константы. В нём может присутствовать практически всё что угодно, или лишь несколько сущностей пары видов.

Правило №2: если нужно — держите сущности в одном месте

Совершенно нормально, когда в одном модуле имеется несколько классов. Так и стоит организовывать код (но, конечно, только если классы связаны с модулем).

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

Часто встречается мнение, что это — пример неудачного приёма работы. Те, кто так считают, находятся под влиянием опыта, полученного после использования других языков программирования, которые принуждают к другим решениям (например — это Java и C#).

Правило №3: давайте модулям имена, представляющие собой существительные во множественном числе

Давая модулям имена, следуйте общему правилу, в соответствии с которым эти имена должны представлять собой существительные во множественном числе. При этом они должны отражать особенности предметной области проекта.

Правда, у этого правила есть и исключение. Модули могут называться core , main.py или похожим образом, что указывает на то, что они представляют собой некую единичную сущность. Подбирая имена модулей, руководствуйтесь здравым смыслом, а если сомневаетесь — придерживайтесь вышеприведённого правила.

Реальный пример именования модулей

Вот мой проект — Google Maps Crawler, созданный в качестве примера.

Этот проект направлен на сбор данных из Google Maps с использованием Selenium и на их представление в виде, удобном для дальнейшей обработки (тут, если интересно, можно об этом почитать).

Вот текущее состояние дерева проекта (тут выделены исключения из правила №3):

gmaps_crawler ├── src │ └── gmaps_crawler │ ├── __init__.py │ ├── config.py (форма единственного числа) │ ├── drivers.py │ ├── entities.py │ ├── exceptions.py │ ├── facades.py │ ├── main.py (форма единственного числа) │ └── storages.py │ ├── .gitignore ├── pyproject.toml └── README.md

Весьма естественным кажется такой импорт классов и функций:

from gmaps_crawler.storages import get_storage from gmaps_crawler.entities import Place from gmaps_crawler.exceptions import CantEmitPlace

Можно понять, что в exceptions может иметься как один, так и множество классов исключений.

Именование модулей существительными множественного числа отличается следующими приятными особенностями:

  • Модули не слишком «малы» (в том смысле, что предполагается, что один модуль может включать в себя несколько классов).
  • Их, если нужно, в любой момент можно разбить на более мелкие модули.
  • «Множественные» имена дают программисту сильное ощущение того, что он знает о том, что может быть внутри соответствующих модулей.

Именование классов, функций и переменных

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

Имена функций и методов должны быть глаголами

Функции и методы представляют собой действия, или нечто, выполняющее действия.

Функция или метод — это не просто нечто «существующее». Это — нечто «действующее».

Действия чётко определяются глаголами.

Вот — несколько удачных примеров из реального проекта, над которым я раньше работал:

def get_orders(): . def acknowledge_event(): . def get_delivery_information(): . def publish(): .

А вот — несколько неудачных примеров:

def email_send(): . def api_call(): . def specific_stuff(): .

Тут не очень ясно — возвращают ли функции объект, позволяющий выполнить обращение к API, или они сами выполняют какие-то действия, например — отправку письма.

Я могу представить себе такой сценарий использования функции с неудачным именем:

email_send.title = «title» email_send.dispatch()

У рассмотренного правила есть и некоторые исключения:

Имена переменных и констант должны быть существительными

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

Вот примеры удачных имён:

plane = Plane() customer_id = 5 KEY_COMPARISON = «abc»

Читайте также:
Установить программу интернет радио

Вот — неудачные имена:

fly = Plane() get_customer_id = 5 COMPARE_KEY = «abc»

А если переменная или константа представляют собой список или коллекцию — им подойдёт имя, представленное существительным во множественном числе:

planes: list[Plane] = [Plane()] # Даже если содержит всего один элемент customer_ids: set[int] = KEY_MAP: dict[str, str] = # Имена словарей остаются существительными в единственном числе

Имена классов должны говорить сами за себя, но использование суффиксов — это нормально

Отдавайте предпочтение именам классов, понятным без дополнительных пояснений. При этом можно использовать и суффиксы, вроде Service , Strategy , Middleware , но — только в крайнем случае, когда они необходимы для чёткого описания цели существования класса.

Всегда давайте классам имена в единственном, а не во множественном числе. Имена во множественном числе напоминают имена коллекций элементов (например — если я вижу имя orders , то я полагаю, что это — список или итерируемый объект). Поэтому, выбирая имя класса, напоминайте себе, что после создания экземпляра класса в нашем распоряжении оказывается единственный объект.

Классы представляют собой некие сущности

Классы, представляющие нечто из бизнес-среды, должны называться в соответствии с названиями связанных с ними сущностей (и имена должны быть существительными!). Например — Order , Sale , Store , Restaurant и так далее.

Пример использования суффиксов

Представим, что надо создать класс, ответственный за отправку электронных писем. Если назвать его просто Email , цель его существования будет неясна.

Кто-то может решить, что он может олицетворять некую сущность:

email = Email() # Предполагаемый пример использования email.title = «Title» email.body = create_body() email.send_to = «guilatrova.dev» send_email(email)

Такой класс следует назвать EmailSender или EmailService .

Соглашения по именованию сущностей

Следуйте этим соглашениям по именованию сущностей:

Тип

Общедоступный

Внутренний

Источник: habr.com

Структура программы на языке Python. Операции и переменные. Типы данных

Программирование на языке Python (§ 54 - § 61)

Повторение
Разработка языка Python
Python сегодня —
была начата в 1989 году Гвидо ван
Россумом.
это активно развивающийся
высокоуровневый многоцелевой язык
программирования.
Python – интерпретируемый
язык программирования.
Это означает, что программа, которая
на
нём написана, при каждом выполнении
сначала переводится в двоичный код, а
затем выполняется.

3.

Вопросы к изучению
1
2
3
Структура
программы на
языке Python.
Операции и
переменные.
Типы данных.

4.

Структура программы
на языке Python
Модуль —
Программа
Модуль 1
*.py
Модуль 2
*.py
Модуль 3
*.py
это ряд связанных между собой
операций.
Инструкция 1
Инструкция 2

Инструкция n
Инструкции —
это указания компьютеру,
определяющие, какие операции
выполнит компьютер над данными.
Простые
Инструкции
состоят из одной строки кода
Составные
содержат вложенные инструкции

5.

Структура программы
на языке Python
Модуль —
Программа
Модуль 1
*.py
Модуль 2
*.py
Модуль 3
*.py
это ряд связанных между собой
операций.
Инструкция 1
Инструкция 2

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

6.

Пример
Модуль
modul_1.py
Инструкция
print (2 * (10 — 4))
Выражение

7.

Операции
Операции —
Операнды
это любые действия над операндами.
Операнды —
это некоторые данные.
2 * (10 — 4)
Операнды

8.

Операции
Операции —
это любые действия над операндами.
Операнды —
это некоторые данные.
Приоритет выполнения операций
соответствует принятому в математике.
Операнды:
литералы;
выражения;
переменные.
2 * (10 — 4)
2 * 6
12

9.

Операции
Операции —
это любые действия над операндами.
Операнды —
это некоторые данные.
Приоритет выполнения операций
соответствует принятому в математике.
Операнды:
литералы;
выражения;
переменные.
Литерал
2 * (10 — 4)
Литералы
Выражение

10.

Переменные
Переменная:
Имя переменной
Переменная —
это именованная область оперативной
памяти, в которой хранятся некоторые
данные определённого типа.
a
75
Ячейка оперативной Значение
памяти
переменной

11.

Инструкция присваивания
Инструкция присваивания
определяет данные, соответствующие
переменной.
Запись инструкции:
=
Пример:
a=4

12.

Задача
В среде разработки языка Python, в интерактивном режиме, присвоить
переменной t значение 15, после чего убедиться, что операция выполнена.
Имя переменной:
должно выбираться
осмысленно;
не должно совпадать со
служебными словами языка;
не должно содержать
служебные символы;
не должно начинаться с цифры.

13.

Типы данных в языке Python
Основные
типы данных
Вещественные
числа
Целые числа
Символьные
строки
float
int
str
3.5, -6.7
0, 7, -12
‘У собаки 4 лапы.’

Читайте также:
Программы улучшить качество звука на компьютере

14.

Типизация в языке Python
Объявление переменной в Pascal:
a: integer;
При объявлении переменной
за ней закрепляется ячейка оперативной
памяти, находящаяся по некоторому
адресу, а также определяется тип данных,
которые в ней будут храниться.
Объявление переменной в
языке Python
происходит автоматически перед её
первым использованием.
>>> t = 15
>>> print (t)

15.

Типизация в языке Python
Объявление переменной в Pascal:
a: integer;
При объявлении переменной
за ней закрепляется ячейка оперативной
памяти, находящаяся по некоторому
адресу, а также определяется тип данных,
которые в ней будут храниться.
Объявление переменной в
языке Python
происходит автоматически перед её
первым использованием.
В языке Python используется
динамическая типизация.
Это означает, что тип переменной
определяется автоматически, в
зависимости от присвоенного ей
значения, а так как значение
переменной в ходе исполнения
программы может изменяться, то и тип
переменной также изменяется вслед за
значением.

16.

Задача
Написать модуль, в котором переменным a и b присваиваются значения
соответственно равные 8.5 и 6, а переменной c – значение суммы a и b.
После чего выводятся на экран значения: переменной c, разности а и b, их
произведения, частного, а также ab.

17.

Выполнение инструкции
присваивания
float
8.5
a = 8.5
b = 6
c = a + b

18.

Выполнение инструкции
присваивания
int
6
a = 8.5
b = 6
c = a + b

19.

Выполнение инструкции
присваивания
float
14.5
a = 8.5
b = 6
c = a + b
8.5
6
14.5

20.

Структура программы на языке Python.
Операции и переменные.
Типы данных
Программа на языке Python
Операции —
совокупность модулей, состоящих из
инструкций, в которые, в свою очередь,
могут входить выражения.
это любые действия над данными.
Переменные —
это именованные области оперативной
памяти, в которых могут храниться
данные определённого типа.
Основные типы данных:
целые числа – int;
вещественные числа – float;
символьные строки – str.

21.

Структура программы на языке Python.
Операции и переменные.
Типы данных
Динамическая типизация
В языке Питон переменные объявляются
автоматически при первом использовании.
Тип данных, хранящихся в переменной,
изменяется в ходе исполнения программы в
зависимости от того, какое значение
присваивается переменной.

Источник: ppt-online.org

Русские Блоги

1、
Наиболее отличительной особенностью Python является использование отступа для представления блоков кода без использования фигурных скобок <>.

Число пробелов с отступами является переменным, но операторы в одном и том же блоке кода должны содержать одинаковое количество пробелов с отступами.

2. Как найти основную программу
Python использует выравнивание отступов для организации выполнения кода. Весь код без отступов (определения функций и определения классов) будет выполняться автоматически при загрузке. Эти коды можно рассмотреть Это основная функция Python. Каждый файл (модуль) может произвольно написать некоторый код, который не имеет отступов и автоматически выполняется при загрузке.

Чтобы отличить основной исполняемый файл от вызываемого файла, Python представил переменную __name__, когда файл вызывается , Значение __name__ — это имя модуля, когда файл выполняется, __name__ is ‘main». Поэтому в предыдущем коде мы можем использовать этот метод для установки вызова основной функции.

Интеллектуальная рекомендация

DQL Connection Query Введение в MySQL

DQL Connection Query Введение Запрос соединения На основании возраста: Стандарт SQ192 (только поддерживает внутреннее соединение) SQ199 Стандарт Функция разделена: Внутренняя связь Эквивалентное соеди.

Java.lang.ClassCastException в EJB

1. Издательский сервер Я использую myeclipse, поэтому создание проекта ejb относительно просто. Публикация — это то же, что и обычная публикация кота 2. Соедините ejb с проектом Java Есть много причин.

SpringCloud-Service Consumer + Балансировка нагрузки

POM Начать урок Параметр конфигурации Удаленный звонок Вызов контроллера Использование симуляции, балансировки нагрузки по умолчанию Обычная балансировка нагрузки rpc.

02-константы и переменные

1. Давайте поговорим конкретно о константах и ​​переменных в Swift. * Это предусмотрено в Swift: при определении идентификатора необходимо четко указать, является ли идентификатор константой или перем.

Плоскость сегментация

Тема: Существуют n прямых линий, пересекающих друг друга, из которых есть p (p> = 2) твердые точки, чтобы найти количество плоскостей, которые можно разделить. Когда вы смотрите на этот вопрос, как.

Источник: russianblogs.com

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru