КулЛиб - Классная библиотека! Скачать книги бесплатно
Всего книг - 712276 томов
Объем библиотеки - 1399 Гб.
Всего авторов - 274427
Пользователей - 125050

Новое на форуме

Новое в блогах

Впечатления

Влад и мир про Владимиров: Ирландец 2 (Альтернативная история)

Написано хорошо. Но сама тема не моя. Становление мафиози! Не люблю ворьё. Вор на воре сидит и вором погоняет и о ворах книжки сочиняет! Любой вор всегда себя считает жертвой обстоятельств, мол не сам, а жизнь такая! А жизнь кругом такая, потому, что сам ты такой! С арифметикой у автора тоже всё печально, как и у ГГ. Простая задачка. Есть игроки, сдающие определённую сумму для участия в игре и получающие определённое количество фишек. Если в

  подробнее ...

Рейтинг: 0 ( 0 за, 0 против).
DXBCKT про Дамиров: Курсант: Назад в СССР (Детективная фантастика)

Месяца 3-4 назад прочел (а вернее прослушал в аудиоверсии) данную книгу - а руки (прокомментировать ее) все никак не доходили)) Ну а вот на выходных, появилось время - за сим, я наконец-таки сподобился это сделать))

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

В начале

  подробнее ...

Рейтинг: +1 ( 1 за, 0 против).
DXBCKT про Стариков: Геополитика: Как это делается (Политика и дипломатия)

Вообще-то если честно, то я даже не собирался брать эту книгу... Однако - отсутствие иного выбора и низкая цена (после 3 или 4-го захода в книжный) все таки "сделали свое черное дело" и книга была куплена))

Не собирался же ее брать изначально поскольку (давным давно до этого) после прочтения одной "явно неудавшейся" книги автора, навсегда зарекся это делать... Но потом до меня все-таки дошло что (это все же) не "очередная злободневная" (читай

  подробнее ...

Рейтинг: +1 ( 1 за, 0 против).
DXBCKT про Москаленко: Малой. Книга 3 (Боевая фантастика)

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

В общем герою (лишь формально вникающему в разные железки и нейросети)

  подробнее ...

Рейтинг: +1 ( 1 за, 0 против).
Влад и мир про Черепанов: Собиратель 4 (Боевая фантастика)

В принципе хорошая РПГ. Читается хорошо.Есть много нелогичности в механике условий, заданных самим же автором. Ну например: Зачем наделять мечи с поглощением душ и забыть об этом. Как у игрока вообще можно отнять душу, если после перерождении он снова с душой в своём теле игрока. Я так и не понял как ГГ не набирал опыта занимаясь ремеслом, особенно когда служба якобы только за репутацию закончилась и групповое перераспределение опыта

  подробнее ...

Рейтинг: 0 ( 0 за, 0 против).

Типизированный Python для профессиональной разработки [Алексей Голобурдин] (pdf) читать постранично, страница - 3

Книга в формате pdf! Изображения и текст могут не отображаться!


 [Настройки текста]  [Cбросить фильтры]

редакторе кода в вашей IDE, либо хотя бы на этапе
проверки программы перед её сборкой и публикацией на сервер.
На википедии есть прекрасная страница про системы типов, Type system:
Wikipedia
The main purpose of a type system is to reduce possibilities for bugs in computer
programs by defining interfaces between different parts of a computer program, and
then checking that the parts have been connected in a consistent way.

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

Допустим, у нас есть вот такая функция:

def validate_user(user):
"""Проверяет юзера, райзит исключение, если с ним что-то не так"""
validate_user_on_server(user)
check_username(user)
check_birthday(user)

Под user тут подразумевается объект юзера, например, ORM объект, то есть запись
из базы данных, преобразованная в специальный Python объект. Человек,
написавший код, это знает. В момент написания кода знает. Через месяц он об этом
совершенно точно забудет, а человек, не писавший этот код, об этом знать вовсе не
может. По сигнатуре функции def validate_user(user) нельзя понять, какой тип
данных ожидается в user, но при этом очень легко сделать предположение об этом
типе — и ошибиться.
Спустя пол года дописывается какой-то новый код и функция validate_user в нём
внезапно начинает вызываться с аргументом user, который равен не ORM объекту, а
числу — просто потому что совсем неочевидно, что в user на самом деле
подразумевается не число:

user_id = 123
validate_user(user_id)

Этот код упадёт только в рантайме. Потому что IDE или статический анализатор кода
не смогут понять, что тут есть какая-то ошибка.
Как сделать так, чтобы мы узнали об ошибке до этапа рантайма? Явным образом
указать тип для атрибута user, например, если это экземпляр датакласса User, то так
(о датаклассах мы поговорим подробнее дальше):

from dataclasses import dataclass
import datetime
@dataclass
class User:
username: str
created_at: datetime.datetime
birthday: datetime.datetime | None
def validate_user(user: User):

"""Проверяет юзера, райзит исключение, если с ним что-то не так"""
validate_user_on_server(user)
check_username(user)
check_birthday(user)

Датакласс определяет просто структуру данных с полями username, created_at и
birthday, причём тип поля username — строка, тип created_at — datetime, а birthday
хранит None или значение типа datetime.
И теперь такой код:

user_id = 123
validate_user(user_id)

подкрасится ошибкой уже в IDE на этапе написания кода (например, в PyCharm или
настроенном VS Code или nvim), а также код упадёт с ошибкой в статическом
анализаторе кода, который запустится при сборке проекта перед его публикацией на
сервер.

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

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

Читаемость, понятность и поддерживаемость кода
Вернёмся к нашей функции:
def validate_user(user):
"""Проверяет юзера, райзит исключение, если с ним что-то не так"""
validate_user_on_server(user)
check_username(user)
check_birthday(user)

Представим, что ты пока не очень опытный программист, который только пришел в
компанию, и тебе дали задачу добавить ещё одну проверку по юзеру, чтобы
валидацию проходили только пользователи, созданные вчера или раньше. Ты этот
код очевидно не писал, видишь его впервые и как тут всё работает ещё не знаешь.
Тут user — это что? Это словарь key-value? Это ORM объект? Это Pydantic модель? У
этого юзера тут есть поле created_at, дата создания, или нет? Оно нам в нашей
задаче ведь нужно будет.
Как ответить на эти вопросы? Перелопачивать код, который вызывает эту нашу
функцию validate_user. А там тоже непонятно, что в user лежит. Там 100500 функций
выше, и где и когда там появляется user и что в нём лежит — большой-большой
вопрос; плюс мы нашли 2 сценария, в одном наша функция вызывается с dict'ом, то
есть user это словарь, а в другом сценарии функция вызывается с ORM моделью, и
возможно еще какой-то код вызывает еще как-то иначе нашу горе-функцию
validate_user. Вот как с этим жить? Вам может понадобиться конкретно
перелопатить весь проект, чтобы понять, как добавить абсолютно простейшую
проверку.
А если бы здесь был такой код — то все вопросы решились бы мгновенно:

from dataclasses import dataclass
import datetime
@dataclass
class User:
username: int
created_at: datetime.datetime
birthday: datetime.datetime | None
def validate_user(user: