ITDEAL
1.11K subscribers
749 photos
108 videos
11 files
572 links
Разработка комплексных IT решений для бизнеса и частных заказчиков.

Чат: @pybytes_chat

Founder: @lunasantrope
Download Telegram
SOLID | Принципы программирования (часть 1)

🖥 SOLID — это 5 основных принципов объектно-ориентированного программирования, которые смогут сделать код более читаемым и гибким, а также уменьшат риск ошибок. Их предложил Роберт Мартин (также известный как Дядя Боб), и они расшифровываются следующим образом:

🔤 S – Принцип единственной ответственности (Single Responsibility Principle)
🔤 O – Принцип открытости/закрытости (Open‐Closed Principle),
🔤 L – Принцип подстановки Барбары Лисков (Liskov Substitution Principle),
🔤 I – Принцип разделения интерфейсов (Interface Segregation Principle),
🔤 D – Принцип инверсии зависимостей (Dependency Inversion Principle).

🚶‍♀️ Мы пойдем по порядку и сначала разберем принцип единственной ответственности. Принцип говорит, что у каждого класса должна быть только одна «ответственность» и он не должен брать на себя другие обязанности.

🥸 То есть, к примеру, мы реализуем класс заказа Order, методом которого является расчет общей стоимости. Если мы хотим добавить в код сохранение заказа в базу данных, то логичней будет реализовать новый класс, который будет отвечать за работу с БД, а не добавлять сохранение данных в класс Order.

🔝 PyBytes Media | ✉️ Telegram / 📷 Instagram
Please open Telegram to view this post
VIEW IN TELEGRAM
5👍2
SOLID | Принципы программирования (часть 2)

🖥 O — Принцип открытости/закрытости (Open‐Closed Principle). Этот принцип был впервые сформулирован Бернардом Мейером в 1988 году, а Дядя Боб говорил о нем так: «Сущности программы (классы, модули, функции и т.п.) должны быть открыты для расширения, но закрыты для изменений».

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

💥 Представим, что мы снова оказались в школе и наша задача создать код для расчета площадей разных фигур — геометрический калькулятор. Мы можем сделать один класс Shape, который будет отвечать за работу с несколькими фигурами сразу, однако в таком случае, если мы захотим расширить возможности кода, нам придется его менять.

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

🔝 PyBytes Media | ✉️ Telegram / 📷 Instagram
Please open Telegram to view this post
VIEW IN TELEGRAM
5👍1
Первый в мире закон об ИИ

🧠 Недавно Евросоюз одобрил первый в мире закон, регулирующий использование искусственного интеллекта — EU AI Act. Вводится множество правил и огранечений для технологий ИИ, вот некоторые из них:

🔤 Запрещается использовать ИИ для распознания эмоций людей на рабочих местах и в школах.
🔤 Полиции запрещается использовать прогнозирование и моделирование опасностей, основанное на ИИ.
🔤 Системы генеративного ИИ (ChatGPT, Gemini, Copilot) обязуются соблюдать законодательство об авторских правах, раскрытия информации об обучении моделей, регулярного тестирования кибербезопасности.

💲 Полностью закон вступит через 12 месяцев, уже существующим системам дадут переходный период в 36 месяцев. За нарушение закона компании оштрафуют на сумму до 35 млн евро или 7% годовой выручки.

🔝 PyBytes Media | ✉️ Telegram / 📷 Instagram
Please open Telegram to view this post
VIEW IN TELEGRAM
👍61
SOLID | Принципы программирования (часть 3)

👀 L — принцип подстановки Лисков (Liskov Substitution Principle — LSP). Впервые принцип был предложен Барбарой Лисков в 1987 году, однако более популярна интепретация Дядя Боба: «Функции, которые используют базовый тип, должны иметь возможность использовать подтипы базового типа, не зная об этом»

📊 Класс-потомок должен дополнять, а не менять поведение родительского класса, то есть, подкласс должен быть способен выполнять те же действия, что и класс-родитель. В таком случае принцип LSP будет соблюден.

🚶‍♀️ Предположим, что у нас есть класс Car, от которого наследуется класс PetrolCar. У этих классов пока нет методов для добавления свойств, поэтому каждый разработчик может реализовать их несколькими способами: где-то, к примеру, через кортеж, а где-то через словарь. В таком случае может произойти ошибка.

🥸 Лучше будет создать методы setter и getter в суперклассе Car. Так мы можем устанавливать и получать свойства автомобиля, оставляя их формат везде единным.

🔝 PyBytes Media | ✉️ Telegram / 📷 Instagram
Please open Telegram to view this post
VIEW IN TELEGRAM
4👍1
SOLID | Принципы программирования (часть 4)

🖥 I — Принцип разделения интерфейсов (Interface Segregation Principle — ISP). Этот принцип был предложен Дядей Бобом, когда он консультировал компанию Xerox. Принцип гласит: «Программные сущности не должны зависеть от методов, которые они не используют».

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

☺️ Предположим, что у нас есть абстрактный класс Worker c двумя абстрактными методами work() и eat(). Мы создаем два подкласса: HumanWorker и RobotWorker. Мы вынуждены реализовать оба метода в обоих классах, хотя классу RobotWorker метод eat() не нужен (роботы пока есть не умеют).

😉 Чтобы соблюсти ISP можно создать два абстрактных класса с соответствующими методами: Workable и Eatable. Это позволит классу RobotWorker быть подклассом только Workable, что даст возможность не реализовать ненужные методы.

🔝 PyBytes Media | ✉️ Telegram / 📷 Instagram
Please open Telegram to view this post
VIEW IN TELEGRAM
4👍2
SOLID | Принципы программирования (Заключительная часть)

🖥 D — Принцип инверсии зависимостей (Dependency Inversion Principle — DIP). Этот модуль гласит две вещи:

🔤 Модули высокого уровня не должны зависеть от модулей низкого уровня. Оба типа модулей должны зависеть от абстракций.
🔤 Абстракции не должны зависеть от деталей реализации. Детали реализации должны зависеть от абстракций.

📊 В общем DIP говорит, что не нужно завязываться на конкретную реализацию, к примеру, класса. Нужно инвертировать зависимость и работать с его абстракцией.

☺️ Предположим, что у нас есть абстрактный класс Notification и его два подкласса: EmailSender и SMSNotification. Мы создаем отдельный класс User и хотим, чтобы он имел возможность послать сообщение по e-mail.

🚶‍♀️ Мы можем напрямую завязать класс User на класс EmailSender, однако, следуя DIP, класс User стоит завязать на абстракцию Notfication. Так мы сможем посылать сообщение не только по e-mail и классы будут зависеть только от абстракций, что сделает код более гибким и легким для тестирования.

😎 В итоге мы с вами разобрали основные принципы программирования, которые смогут повысить качество ваших проектов. Однако стоит понимать, что не всегда надо следовать SOLID. Хоть они являются важной частью, их использование может внести в проект избыточную асбтракцию или сложность. Применяйте SOLID с умом!

🔝 PyBytes Media | ✉️ Telegram / 📷 Instagram
Please open Telegram to view this post
VIEW IN TELEGRAM
3
Тестирование с Python (часть 1)

📈 Тестирование — важная часть при работе над проектом, цель которой убедиться, что код работает правильно и соответствует требованиям. Скорее всего вы привыкли просто вводить разные данные в программу без всяких скриптов — это называется ручным тестированием.

🫣 Однако размер проектов растет и количество тестов тоже. Тогда на помощь приходит автоматизированное тестирование — тестирование кода с помощью другого кода. Для таких задач в Python есть множество библиотек, самые популярные: unittest (встроенная) и pytest.

🔤 А вообще все тестирование начинается со встроенной команды assert, которая помогает проверить условие. Выглядит примерно так:

assert x == "hello", "x should be 'hello'"


📌 Если x будет равняться "hello", то программа продолжит работу, однако в случае False код остановится и будет вызвана ошибка AssertionError вместе с надписью: "x should be 'hello’".

🔝 PyBytes Media | ✉️ Telegram / 📷 Instagram
Please open Telegram to view this post
VIEW IN TELEGRAM
👍43
Тестирование с Python (часть 2)

🖥 Для проверки отдельных фрагментов кода или модульного тестирования (unit testing) в Python есть встроенный фреймворк unittest. Работа с ним происходит через ООП и изначально он был вдохновлен фреймворком для юнит-тестирования в Java — JUnit.

☺️ Для первого теста создадим файл math_operations.py, где будут две функции для сложения и умножения: add() и multiple(). Потом создаем файл test_math_operations.py с нашими тестами. Желательно, чтобы название файла начиналось с префикса test (unittest поддерживает обнаружение файлов, основанное на их названии).

😉 Теперь создаем класс TestOperations, который наследуется от класса unittest.TestCase. Наконец внутри нашего класса мы можем создавать тесты, и их название тоже должно начинаться с префикса test.

def test_add(self):
self.assertEqual(add(2, 3), 6)


📌 Этот тест проверит функцию add(): будет ли вывод функции с аргументами 2 и 3 равен значению 6. Для того, чтобы запустить тест, в самом файле можно воспользоваться функцией unittest.main(verbosity), где verbosity показывает уровень подробности вывода (от 0 до 2). Это не единственный вариант, как можно запускать тесты, но об этом поговорим позже.

🔝 PyBytes Media | ✉️ Telegram / 📷 Instagram
Please open Telegram to view this post
VIEW IN TELEGRAM
3
🚀🌐 ВАКАНСИЯ: Go Developer 🌐🚀


Требования к кандидату:
➡️ Go: Уверенное знание языка, опыт написания и отладки кода.
➡️ Blockchain: Понимание основ (децентрализация, консенсусные алгоритмы, транзакции, смарт-контракты).
➡️ База данных: Опыт работы с SQL и NoSQL.
➡️ Git, IDE, дебаггеры
➡️ Работа в команде: Эффективное взаимодействие, коммуникативные навыки. Готовность обучаться
➡️ Docker
➡️ Solidity


Софт-скилы:
➡️ Коммуникабельность: Способность четко и эффективно общаться в команде.
➡️ Работа в команде: Опыт работы в командной среде, умение слушать и высказывать свое мнение.
➡️ Самостоятельность: Готовность принимать ответственность за свою работу и проявлять инициативу.


🤖 Контакты @lunasantrope
Please open Telegram to view this post
VIEW IN TELEGRAM
👍21
Тестирование с Python (часть 3)

📈 Выполнение всех тестов с помощью unittest это хорошо, однако бывают случаи когда их приходится пропускать. К примеру, работа каких-то фукнций в вашей программе зависит от операционной системы или в коде присутствуют устаревшие функции, тесты которых надо пропустить.

🥱 Для пропуска тестов можно их продекорировать с помощью следующих вариантов:

🔤 @unittest.skip(reason) — в любом случае пропускает задекорированный тест.
🔤 @unittest.skipIf(condition, reason) — пропускает тест, если условие condition верно.
🔤 @unittest.skipUnless(condition, reason) — пропускает тест, если условие condition не верно.

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

🖥 Функция sys.version_info() даст информацию о версии установленного Python, а sys.platform содержит строку с идентификатором ОС.

🔝 PyBytes Media | ✉️ Telegram / 📷 Instagram
Please open Telegram to view this post
VIEW IN TELEGRAM
4👍1
Скобки и точки с зяпятой?
- Не, не слышали.

🔝 PyBytes Media | ✉️ Telegram / 📷 Instagram
Please open Telegram to view this post
VIEW IN TELEGRAM
32
Замыкания в Python (часть 1)

🖥 Замыкание (closure) это функция, которая находится внутри другой функции, и имеет доступ к переменным, объявленным в теле внешней функции. Такие переменные принято называть свободными — переменные, которые используются в функции, но не определены внутри нее и не являются ее аргументами.

def outer(message):
def inner():
print(message)
return inner


👀 Здесь замыканием или вложенной функцией является inner(), которая ссылается на свободную переменную message из функции outer(). Если мы хотим как-то менять свободные переменные, то с изменяемыми типам данных проблем не будет, но в другом случае мы можем получить ошибку UnboundLocalError.

✔️ Тогда на помощь приходит ключевое слово nonlocal, которое говорит, что переменная относится не к вложенной функции. Так переменная становится не локальной, однако за пределами внешней функции сослаться на нее все равно нельзя.

🔝 PyBytes Media | ✉️ Telegram / 📷 Instagram
Please open Telegram to view this post
VIEW IN TELEGRAM
3
Замыкания в Python (часть 2)

😎 Замыкания являются очень полезными в функциональном программировании, к примеру, можно реализовать каррирование (currying) — техника преобразования функции, которая принимает несколько аргументов, в последовательность функций, где каждая принимает один аргумент. Создадим простую функцию для сложения чисел:


def add(x, y):
return x + y

🙂 Чтобы реализовать каррирование нужно воспользоваться замыканием, добавив внутрь еще одну функцию. Новая функция будет выглядеть так:


def curried_add(x):
def add_y(y):
return x + y
return add_y


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


🔝 PyBytes Media | ✉️ Telegram / 📷 Instagram
Please open Telegram to view this post
VIEW IN TELEGRAM
3
Тестирование с Python (часть 4)

🖥 Фикстуры (fixtures) — это набор условий, который необходимо настроить перед выполнением тестов и очистить после их выполнения. Это может гарантировать, что каждый тест начнется в равных условиях вне зависимости от среды. Сегодня разберемся с следующуми типами фикстур: setUp и tearDown.

🔤 setUp — вызывается перед каждым тестовым методом в тестовом классе. Обычно используется для инициализации объектов и создания тестовых данных.

🔤 tearDown — вызывается после каждого тестового метода. В нём обычно выполняется очистка после тестов, например, закрытие файлов или удаление тестовых данных.

🥱 А объектом нашего теста станет примитивная реализация стека — способ организации данных, который работает по принципу «последним пришёл, первым вышел». Главные методы — push() и pop(). Push() позволяет добавлять элементы в конец стека, pop() — получать последний элемент стека.

👀 Документация unittest ТУТ.

🔝 PyBytes Media | ✉️ Telegram / 📷 Instagram
Please open Telegram to view this post
VIEW IN TELEGRAM
42👍1
Тестирование с Python (часть 5)

🖥Сегодня мы закончим фикстуры (fixtures) встроенного модуля unittest. Существует еще два вида фикстур: уровня класса и уровня модуля. Работают они по одинаковому принципу, однако синтаксис отличается.

🙂 Для создания классовых фикстур используются два метода: setUpClass и tearDownClass. Эти методы вызываются только один раз перед запуском первого теста в классе. Используются, к примеру, для подключения к базе данных. Они являются классовыми методами, поэтому их нужно продекорировать с помощью @classmethod.


@classmethod
def setUpClass(cls):
pass


☺️ Для создания модульных фикстур используются две функции: setUpModule и tearDownModule. Они вызываются только один раз перед запуском любых тестов в модуле. Это место для настройки ресурсов, которые нужны во время всего времени выполнения модуля.


def setUpModule():
pass


🔝 PyBytes Media | ✉️ Telegram / 📷 Instagram
Please open Telegram to view this post
VIEW IN TELEGRAM
2
Ближайшее будущее ИИ

🖥 Недавно в сети появился подробный прогноз ближайшего будущего ИИ. Документ был написан бывшим сотрудником OpenAI — Leopold Aschenbrenner, и его размер составляет 165 страниц.

🧠 Создатель предпологает, что к 2027 году достижение AGI (Artificial General Intelligence) считается вполне возможным. Это вторая ступень ИИ, которая должна успешно выполнять любые интеллектуальные задачи, которые под силу человеку.

💥 Также сотрудник говорит, что на этом прогресс не остановится и будет очень быстро развиваться до уровня ASI (Artificial superintelligence). Этот вид ИИ должен обладать полным самосознанием и быть умнее человека.

‼️ Документ в итоге подчеркивает необходимость срочных мер по защите и контролю над развивающимися технологиями ИИ, чтобы избежать возможных угроз. Почитать можно тут: КЛИК

🔝 PyBytes Media | ✉️ Telegram / 📷 Instagram
Please open Telegram to view this post
VIEW IN TELEGRAM
31
Forwarded from ITDEAL
🚀🌐 ВАКАНСИЯ: Go Developer 🌐🚀


Требования к кандидату:
➡️ Go: Уверенное знание языка, опыт написания и отладки кода.
➡️ Blockchain: Понимание основ (децентрализация, консенсусные алгоритмы, транзакции, смарт-контракты).
➡️ База данных: Опыт работы с SQL и NoSQL.
➡️ Git, IDE, дебаггеры
➡️ Работа в команде: Эффективное взаимодействие, коммуникативные навыки. Готовность обучаться
➡️ Docker
➡️ Solidity


Софт-скилы:
➡️ Коммуникабельность: Способность четко и эффективно общаться в команде.
➡️ Работа в команде: Опыт работы в командной среде, умение слушать и высказывать свое мнение.
➡️ Самостоятельность: Готовность принимать ответственность за свою работу и проявлять инициативу.


🤖 Контакты @lunasantrope
Please open Telegram to view this post
VIEW IN TELEGRAM
2
Валидация данных в Python (часть 1)

🖥 Python — это язык динамической типизации, таким образом, указывать типы данных явно не надо. Это ведет к тому, что одной переменной можно присвоить совершенно другое значение. С версии 3.5 в Python есть аннотации типов, однако — это всего лишь подсказка. При неверном типе переменной код все равно продолжит работу.

🥱 Чтобы решить эту проблему, есть два пути: перейти на другой язык или использовать библиотеку Pydanticсамая популярная библиотека для валидации данных. Она позволяет создавать модели данных и автоматически может проверить, правильный ли тип у переменной.

🔤 Чтобы создать нашу первую модель данных, нужно создать класс, который будет наследоваться от класса BaseModel. А дальше просто указать атрибуты и их тип. Pydantic может автоматически понимать аннотации типов Python, если у переменной будет неправильный тип данных — работа прекратится, и будет вызвана ошибка ValidationError.

📌 Также такие классы очень похожи на dataclasses, ведь такие методы, как, к примеру, __init__() и __repr__() будут созданы автоматически.

🔝 PyBytes Media | ✉️ Telegram / 📷 Instagram
Please open Telegram to view this post
VIEW IN TELEGRAM
3
Валидация данных в Python (часть 2)

🫣 Если у вас довольно запутанный и необычный тип данных, к примеру, в имени должно быть строго два пробела, то в таком случае одним из решений будет создание собственной валидации. Для этого Pydantic предлагает нам несколько декораторов, один из них это @field_validator. Он используется для проверки конкретных полей.

👀 Чтобы проверить одно поле, нужно создать метод и продекорировать его с помощью @field_validator. В качестве аргумента нужно передать имя поля, и можно передать аргумент mode. У mode есть два вида: after и before. Первый говорит, что нужно применить валидатор после основной валидации, а второй говорит, что валидатор идет перед.


@field_validator('age', mode='after')
@classmethod
def validate_age(cls, age):
pass


📌 Также стоит упомянуть, что это классовые методы, поэтому первое, что они получают — это сам класс, а не его объект. Поэтому документация рекомендует использовать декоратор @classmethod, чтобы обеспечить правильную проверку типа.

🔝 PyBytes Media | ✉️ Telegram / 📷 Instagram
Please open Telegram to view this post
VIEW IN TELEGRAM
👍42
🙄Сон для слабых

🔝 PyBytes Media | ✉️ Telegram / 📷 Instagram
Please open Telegram to view this post
VIEW IN TELEGRAM
4
Валидация данных в Python (часть 3)

😎 Для более подробной и точной настройки полей моделей Pydantic предлагает нам использовать функцию Field. Первое, что приходит на ум — значения по умолчанию. С помощью Field это очень легко сделать.


from pydantic import BaseModel, Field

class User(BaseModel):
name: str = Field(default=‘Max‘)


🙂 Если в поле name ничего не будет передано, то там будет стоять строка «Max». Также, если мы хотим передать вызваемый объект, который будет генерировать данные для значения по умолчанию, то можно воспользоваться аргументом default_factory.

👀 Однако на этих двух аргументах функционал Field только начинается. Field применяется очень часто и является основным компонентом, поэтому для полного понимания я вам настоятельно рекомендую ознакомиться с документацией.

🔝 PyBytes Media | ✉️ Telegram / 📷 Instagram
Please open Telegram to view this post
VIEW IN TELEGRAM
👍32