Аннотация Generic для классов

  Рет қаралды 1,839

Сурен Хоренян

Сурен Хоренян

Күн бұрын

Пікірлер: 38
@robdiez671
@robdiez671 Ай бұрын
Сурен, все как всегда круто! На мой взгляд ты единственный блогер в РФ кто так все хорошо и доходчиво объясняешь. Вот бы ментера такого) Еще раз спасибо тебе)
@SurenKhorenyan
@SurenKhorenyan Ай бұрын
@@robdiez671 пожалуйста! Очень приятно, спасибо 🥰 Рад, что вам нравится и понятно 😊
@captainkryuk1899
@captainkryuk1899 29 күн бұрын
Красава, классное видео
@SurenKhorenyan
@SurenKhorenyan 29 күн бұрын
@@captainkryuk1899 спасибо! Очень приятно 🥰
@ShugarDaddy
@ShugarDaddy Ай бұрын
Сурен, ты молодец, снимаешь видео по действительно интересным темам. Жду подробный разбор метаклассов😁
@SurenKhorenyan
@SurenKhorenyan Ай бұрын
@@ShugarDaddy спасибо! Рад, что вам понравилось 🥰 Когда-нибудь и про метаклассы поговорим 😊
@zifrit755
@zifrit755 Ай бұрын
Если не ошибаюсь то с 3.11 или с 3.12 писать TypeVar не обязательно, что через квадратные скобки можно передавать. К примеру: class ModelManager[Base: BaseModel](): def __init__(self, model: type[Model]): self._model = model что является аналогом: T = TypeVar("T", bound=BaseModel) class ModelManager(Generic(T)): def __init__(self, model: type[BaseModel]): self._model = model Так же с классами работает: def test[T](t: T): return t Если где ошибка, то подскажите ) Видно было интересным, сам не давно только начал про это изучать и твое видео помогло некоторые моменты прояснить. Надеюсь будет видео и про новый способ работы с Generic ; )
@SurenKhorenyan
@SurenKhorenyan Ай бұрын
@@zifrit755 спасибо! Да, с 3.12 новый синтаксис ввели. Про это ролик уже готов, опубликую в этом году По вашему коду в целом ок, ошибок с первого взгляда не вижу
@IsNotProgrammer
@IsNotProgrammer Ай бұрын
Неплохой обзор, но на 17:00 сомнительный кейс, в плане интерфейса) Думаю одним из лучших примеров дженериков является repo классы для разных таблиц БД
@SurenKhorenyan
@SurenKhorenyan Ай бұрын
Любопытно, что я уже в чате встречал упоминание repo классов. У вас есть примеры такого кода? Покажете? Можете в телеграм чат закинуть
@antonzuzlov2046
@antonzuzlov2046 Ай бұрын
Спасибо за видос, интересно какой AI для автодополнения сейчас используешь?
@SurenKhorenyan
@SurenKhorenyan Ай бұрын
Пожалуйста! Это встроенный оффлайн автокомплит, в настройках Full Line Completion
@antonzuzlov2046
@antonzuzlov2046 24 күн бұрын
@@SurenKhorenyan что-то у меня не получилось это настроить, насколько я понял это в jetbrains AI assistant? платная штука?
@SurenKhorenyan
@SurenKhorenyan 24 күн бұрын
@@antonzuzlov2046 нет, это оффлайн. Локальная простенькая модель. В чате в тг скидывал скриншот
@antonzuzlov2046
@antonzuzlov2046 24 күн бұрын
@@SurenKhorenyan или может это в про версии? у меня СЕ
@SurenKhorenyan
@SurenKhorenyan 24 күн бұрын
@@antonzuzlov2046 это точно только в про версии. Переходите на неё. В чате периодически скидывают ссылку как забрать по скидке. Пользуйтесь
@xewuss3750
@xewuss3750 Ай бұрын
from typing import TypeVar, Generic L = TypeVar("L", bound="Line") class Line(Generic[L]): other: L | None = None @classmethod def make_pair(cls: type[L]) -> tuple[L, L]: left: L = cls() right: L = cls() left.other = right right.other = left return left, right class FizzLine(Line["FizzLine"]): def fizz(self) -> str: return f"Other fizz: {self.other}"
@SurenKhorenyan
@SurenKhorenyan Ай бұрын
@@xewuss3750 оо, любопытный вариант, надо будет проверить, как mypy на это смотрит. Я другое решение покажу в одном из грядущих роликов. Тоже нашёл способ
@AlexAlex-ui5gz
@AlexAlex-ui5gz Ай бұрын
Сурен, а как провернуть фокус, где всё ссылается на друг друга, но нужно распихать всё по разным папкам и не получить цикличность импорта?
@SurenKhorenyan
@SurenKhorenyan Ай бұрын
@@AlexAlex-ui5gz если это только для аннотаций, то под if TYPE_CHECKING сложить. Приходите в тг чат, там подскажут
@AlexAlex-ui5gz
@AlexAlex-ui5gz Ай бұрын
@SurenKhorenyan , например Foo принимает екземпляр Bar, а Bar принимает экземпляр Foo, и всё это в разных файлах, а инициализация в файле main))))
@AlexAlex-ui5gz
@AlexAlex-ui5gz Ай бұрын
@@SurenKhorenyan Это же python, должно быть элегантное решение, я пример проблемы скинул в сообщении выше.
@SurenKhorenyan
@SurenKhorenyan Ай бұрын
​@@AlexAlex-ui5gzа я ещё выше описал решение
@AlexAlex-ui5gz
@AlexAlex-ui5gz 29 күн бұрын
@@SurenKhorenyan благодарю, всё работает)
@balaamster
@balaamster Ай бұрын
Для чего производится замена одинарных кавычек на двойные? Если посмотреть repr какого-нибудь обьекта, то мне чаще попадались одинарные кавычки. В PEP-8 нашел только рекомендацию следовать одному стилю применения кавычек и использовать двойные кавычки для "тройных кавычек". Да и вводить одинарные быстрее, без задействования shift.
@_balancy_
@_balancy_ Ай бұрын
испльзуется обычно то, что принято в команде. На уровне синтаксиса нет рекомендаций. Но так как black распространен как форматтер, то чаще используются двойные, потому что там нет возможности настроить автоконвертацию в одинарные
@xewuss3750
@xewuss3750 Ай бұрын
В большинстве распространённых языков используются двойные кавычки для строк. Гвидо, наверное решил выделиться с кавычками. А также с None вместо Null.
@SurenKhorenyan
@SurenKhorenyan Ай бұрын
@@balaamster как вы написали, в PEP-8 есть рекомендация по использованию двойных кавычек. Например для docstring Получается, если в коде будет использоваться подход с одинарными кавычками, то будет смесь стилей по проекту. Поэтому я решил, что пусть везде будут двойные кавычки. Исправления автоматически делает black, тратить время на набор не придётся
@_balancy_
@_balancy_ Ай бұрын
Сурен, у тебя какой ИИ-плагин используется в IDE для автокомплита?
@xewuss3750
@xewuss3750 Ай бұрын
В ПуЧарм встраивали свой. Но скорее всего - за деньги и не в РФ. Есть codeium, неплохо работает.
@SurenKhorenyan
@SurenKhorenyan Ай бұрын
@@_balancy_ это встроенный Full Line Suggestions, включается в разделе autocomplete
@SurenKhorenyan
@SurenKhorenyan Ай бұрын
@@xewuss3750 мне codeium совсем не зашёл
@_balancy_
@_balancy_ Ай бұрын
@@xewuss3750 я просто copilot юзал некоторое время, но мне не нравится платить и за chatgpt, и за copilot, когда там функции в большинстве дублируются. Думаю codeium попробовать
@yawneed
@yawneed Ай бұрын
@@SurenKhorenyan А можно поподробнее где это? В настройках не нашел.
@hectorhw
@hectorhw Ай бұрын
from typing import Self, reveal_type class Line: other: Self | None = None @classmethod def make_pair(cls: type[Self]) -> tuple[Self, Self]: left = cls() right = cls() left.other = right right.other = left return left, right class FizzLine(Line): def fizz(self) -> str: return f"Other fizz: {self.other}" first, second = FizzLine.make_pair() reveal_type(first.other) # FizzLine | None reveal_type(first.other and first.other.fizz()) # str | None
@SurenKhorenyan
@SurenKhorenyan Ай бұрын
@@hectorhw класс, отличный вариант 🙂 Я именно так и решил. Отдельный ролик сделал про Self Круто, что не я один так придумал 😊
The evil clown plays a prank on the angel
00:39
超人夫妇
Рет қаралды 53 МЛН
Chain Game Strong ⛓️
00:21
Anwar Jibawi
Рет қаралды 41 МЛН
Cheerleader Transformation That Left Everyone Speechless! #shorts
00:27
Fabiosa Best Lifehacks
Рет қаралды 16 МЛН
Знакомство с defaultdict в Python
27:57
Сурен Хоренян
Рет қаралды 1,9 М.
БЕГУЩИЙ ПО PYTEST
10:22
мыш
Рет қаралды 1 М.
Логирование: оставь print позади
38:01
Python Russian
Рет қаралды 26 М.
Как устроен PYTHON
37:44
про АйТи | IT Pro
Рет қаралды 14 М.
The evil clown plays a prank on the angel
00:39
超人夫妇
Рет қаралды 53 МЛН