Добрый день! Спасибо за видео. Парочка вопросов: * Обязан ли pyi файл называться также, как тот файл, который мы описываем? * Как описывать чужую библиотеку, если я не могу класть свои .pyi файлы внутрь библиотеки с таким же названием?
В TypeScript например тайп хинтинги не ограничиваются файлом, ide парсит хинтинг файлы, и сопоставляет хинтинги с обычным js, по имени функции или класса.
+ Вот реализация на JS например, позволяет python в вебе использовать. Или реализация на Rust, в которой насколько я знаю, python код получится скомпилировать
пришел на этот видос с видоса про типизированный пайтон и когда увидел реализацию стаб файлов, точнее как именно они работают и мягко говоря охренел)) какое то время понадобится, чтоб принять новую реальность :D
1:10 мне нравится идея Uncle Bob-a использовать автоматические тесты чтобы показать как нужно взаимодействовать с функциями и какого типа данные они принимают.
Как раз на крайнем Python Conf++ рассказывали про использование stubs для "обтипизации" Django силами monkeytype и волонтерами - хороший пример как и для чего можно применять сабж.
Привет! Клевый канал, смотрю тебя периодически. Больше с точки зрения именно python, чем веб. У тебя есть видео про декораторы? Смысл, как их делать, а главное зачем. Никак не могу найти им применение в реальной жизни. В смысле, понятно, где их можно юзать разработчику библиотек, а разработчику обычных программ есть смысл?
Всем привет Не у кого не возникала проблема, что при переходе на реализацию (хочешь перейти на описание функции ctrl+клик мыши) переходит на эти pyi файлы?
Спасибо за хорошее видео. Тайпхинтинг -- хорошая штука, но есть один нюанс. Для функции `custom_sum` мы указали, что входные аргументы имеют тип `int`, и функция возвращает `int`. Но работать она будет и с `float`. А потом оказывается, что прожуёт она и `decimal.Decimal`. Ну окей, у нас есть `typing.Union` -- в чём проблема перечислить? То же касается возвращаемого результата. А потом вдруг оказывается, что допустимы и типы `numpy.*` -- их предусмотреть уже нетривиальная задача. Не менее смешно, что функция прожуёт и sqlalchemy.Column -- и как такое предусмотреть? Итого по тайпхинтам у меня вопросов больше, чем ответов.
1.Разрабатываем ЯП, в котором не нужно прописывать тип переменной, радуемся тому, как круто теперь можно в любое время переменной присвоить значение любого типа и не задавать его при создании переменной. 2. Начинаем писать большие по объему сложные программные системы, начинаем терять контроль над типами, куда, что передавать, и что возвращает функция. При создании программы ide и при компиляции среда исполнения не могут нам помочь, но далее при исполнении начинает вылетать с ошибкой несоответствия типа. 3. Начинаем придумывать костыли, чтобы ПО могло проверить типы, и не надо было это делать вручную.
Знаю, умею, практикую! Только я называю это аннотациями, а не тайпхинд... тайпхент... Виму, конечно, плевать, но мне удобнее. За видос лайк, читаемость всегда в приоритете!
надеюсь, вы не выносите описания типов из .py файлов в .pyi файлы - .pyi же только для конкретных задач, в основном типы указываются в самом .py исходнике
Там где нет issues, там просто нет пользователей. Ну и специфика такая, пайтон динамической типизации язык, непросто там сделать хорошую проверку. Проверяторов много, там не только mypy
Hint - подсказка, они вообще не строгие, если не накручивать сверху жестких проверок через mypy или еще что-то. Языки со статической типизацией сложны не собственно тем, что надо явно указывать тип для каждой переменной, там куча других сложностей, реально замедляющих разработку
@@t0digital спасибо за ответ, ещё я нашёл вариант с TYPE_CHECKING модуля typing и __futute__.annotations чтобы можно было не указывать кавычки. Может кому пригодится
Мне как новичку в использовании аннотаций не совсем понятно вот что: Допустим у меня есть requests библиотека. То что мне надо сделать? Самому написать pyi файлы к ней и если да, то где потом лучше всего расположить так, чтоб никого из будущих читателей кода не удивлять?
Как правило на библиотеки не пишут pyi файлы - в хороших либах уже есть прописанные типы внутри. В requests почему-то нет. Ну нет и нет, надо прописывать типы самому в своём коде. У любой переменной можно взять type(var), понять, какого она типа и прописать соответствующий тип в своём коде
Вопрос возник. Что если при полиморфном использовании функции в наследниках изменить типы входящих данных - как это отразиться на стаб файлах? Надеюсь понятно изьяснился.
Спасибо за очередное годное видео! У меня есть вопрос. При написании кода бывает полезно создавать свои типы с помощью typing, но они часто засоряют код. Как это лучше всего делать? Как раз в этих pyi файлах? Жду новую рубрику🤯
Спасибо! Pyi файлы только для особых случаев - код, который должен работать на 2 и 3 питоне или постановка типов для кода, внутрь которого нельзя влазить менять его. В остальных случаях целесообразно использовать type hintings внутри самого кода
@@t0digital Спасибо за ответ! Мне стало интересно, как в Джанге, например, используются type hintnig'и. Я посмотрел исходный код на гитхабе, но не увидел их там. Но IDE ведь даëт подсказки. Как так 😕
Колокольчик поставил давно. Вот как ж...й чувствовал, когда на канал подписывался, что начну писать на пайтон... И вот случилось! На работе, пишу утилиты для системы тестирования...
Если видео о pyi-файлах вообще, то хотелось бы ещё услышать в нем, что можно засунуть в тело функции кроме "...". У меня вот после просмотра остался открытый вопрос, который придется идти гуглить.
@@t0digital В том-то и вопрос. Зачем вообще оставили необходимость писать многоточие, если тело функции в этих файлах ничего не значит? Это лишние символы и место, которое ассоциируется с неким функционалом, которого на деле нет.
Это что то по типу такого ? if type(a) == int: ........ только получается вместо такой конструкции IDE сама проверяет типы аргументов исходя из pyi файла . Лутц писал, что мол так лучше вообще не делать. Гибкость языка теряется, полиморфизм пропадает и все такое. Заранее извиняюсь если не понял.
Нет. Например, если бы не добавлялось 123, то функция работала бы и со строками - питон бы такое не запретил (если хотите, чтобы запрещал - посмотрите пакет mypy). "Кодекс это просто свод указаний, а не жестоких законов" - так же и с тайпхинтингами. Хотелось бы также добавить, что type(a)==Class - плохой стиль, потому что наследники Class синтаксически не будут подходить, хотя код, наверное, для них тоже должен работать. Правильно использовать isinstsnce(a, Class). Хотя наследоваться от int - это удел извращенцев, такие проверки немного режут глаз
Это не костыли. Такие type hints (включая py стабы) в динамических языках носят лишь рекомендательный характер и в целом можно положить на них болт, так и на их варнинги, и писать как захочешь. В статических же, это обязаловка, которая иногда очень напрягает и замедляет разработку. И там и там есть минусы и плюсы, а все эти споры вокруг языков и их возможностей, это какое-то самоутверждение школьников в пубертатном периоде. Если вы (и не только вы) такие умные, пиши реализацию spatio-themporal трехголового anchor free детектора на плюсах, а высоконагруженный сервис с минимальным latency на python, тогда видимо костыли перестанут мерещиться.
@@Tantal180 вокруг языков никто не спорит, но возможность "рекомендательно" указывать типы и класть на них болт можно и без этих файлов, а явно в самом коде.
Белый фон жёстко бьёт по глазам, когда смотришь в темноте особенно. Старый был лучше намного.
Да, больше так не будем
Это в хромакей забыл текстуру
Белый фон. Вот, что значит "попал в рай без очереди"
Хромакей для расистов
На аве у тебя главная героиня в аниме: Девушка на час?
@@engsara1610 да
Добрый день! Спасибо за видео. Парочка вопросов:
* Обязан ли pyi файл называться также, как тот файл, который мы описываем?
* Как описывать чужую библиотеку, если я не могу класть свои .pyi файлы внутрь библиотеки с таким же названием?
теоретически, мы можем импортировать необходимые методы из библиотеки в такой utils-модуль и для него уже создать *.pyi файл.
В TypeScript например тайп хинтинги не ограничиваются файлом, ide парсит хинтинг файлы, и сопоставляет хинтинги с обычным js, по имени функции или класса.
Пушка! Продолжай радовать нас полезной инфой)
Максимально полезная инфа ! :)
Всё доходчиво!!! Подача материала супер. Успехов и 1 000 000 пользователей.
Спасибо!
Комментарий от python разработчика из Сибири.
Видео хорошие, keep it up!
Хотелось бы услышать от тебя об различных реализациях Пайтона, думаю многим будет интересно :)
+
Вот реализация на JS например, позволяет python в вебе использовать. Или реализация на Rust, в которой насколько я знаю, python код получится скомпилировать
Алексей: % рассказывает про pyi файлы в python %
Зрители: Стаканчик! Я_вижу_стаканчик! Как отвести взгляд от стаканчика? 🍵😨
никак, это нативная интеграция :)
а что с ней не так то?
- Видишь стаканчик ? И я вижу. А его нет.
Рисковый номер! Впервые на арене Алексей в приветствии не называет всех зрителей котами-котонами!
пришел на этот видос с видоса про типизированный пайтон и когда увидел реализацию стаб файлов, точнее как именно они работают и мягко говоря охренел))
какое то время понадобится, чтоб принять новую реальность :D
Диджитализируй! - познавательный. Спасибо, теперь знаю что это и зачем.
Новая рубрика огонь!
Круто, как всегда. Ждём новую рубрику и побольше бы таких фишечек. Спасибо за полезный видос.
Спасибо за выпуск! Полезная инфа! Я до этого пользовался :type: в docstring. Тоже норм работает если в проекте не используется тайпинг
Супер! Спасибо! Ждём новую рубрику)
До до крутые
Спасибо за видео!
О! У Вас появился спонсор? Поздравляю! :)
Около 30 спонсоров на бусти, уже давно :) додо нет
Можете снять видос как вы просто делаете какой-то проект на django если не сложно. Я буду очень рад:)
Очень полезное видео! Продолжайте в том же духе)))
Спасибо за выпуск, лайк!
Большое спасибо за видео
Спасибо большое за полезные видео!
Не все пользуются колокольчиками, и я один из них.
Но я не пропускаю видео, т.к. подписок, еще и часто публикующих - не так много)
Добрый день!, ваши видео дали мне шанс заработать с удовольствием. Спасибо большое )
Оч круто! Спасибо)
Отлично, так потихоньку, смотря прикольные видео, и питону параллельно можно научиться. Круто, спасибо!
Было полезно как всегда, спасибо!
О как. Круто. Спасибо. Пригодится.
Агонь! Вообще агонь!
А на сегодня всё, до новых встреч
Спасибо. Было интересно и понятно.
Спасибо за практическое видео! Очень интересно и полезно оказалось!
Спасибо, хорошая инфа. Алексей, что там с курсами?
скоро-скоро
Спасибо за выпуск
Алексей, у вас был такой прекрасный и уютный фон! Подумайте, возможно стоит откатиться!
Точно стоит, этот не зашёл:)
1:10 мне нравится идея Uncle Bob-a использовать автоматические тесты чтобы показать как нужно взаимодействовать с функциями и какого типа данные они принимают.
Больше подобных полезных штук!
прикольно не знал, спасибо
Удобная фишка в использовании python)
вообще-то в расматриваемой функции и float и int можно использовать например. Это как-то можно захинтить чтоб оба варианта принимались?
Как раз на крайнем Python Conf++ рассказывали про использование stubs для "обтипизации" Django силами monkeytype и волонтерами - хороший пример как и для чего можно применять сабж.
Дааа!
ua-cam.com/video/apoial8krAw/v-deo.html - забыл ссылку добавить
Привет! Клевый канал, смотрю тебя периодически. Больше с точки зрения именно python, чем веб.
У тебя есть видео про декораторы? Смысл, как их делать, а главное зачем.
Никак не могу найти им применение в реальной жизни.
В смысле, понятно, где их можно юзать разработчику библиотек, а разработчику обычных программ есть смысл?
Как поставить 100 оайков?) И снова спасибо тебе, как всегда, самые лучшие практики и советы. Выкатывай новую рубрику в продакшен!)
Спасибо!
Часто бывает необходимо скомпилировать и/или собрать пакет , например rpm кода на python , расскажи , пож-та , про лучшие способы это сделать )
топ урок. простой и полезный
Подскажите, есть ли какая то информация по поводу ваших курсов? Когда планируется запуск?
планируется, надеюсь в октябре закончить работу над первым модулем
Диджитализируй! Спасибо, очень хочется посмотреть на результат вашей работы)
А можно как-то автоматом генерировать заполнение pyi?
можно
Агонь!!!
Крутяк)
а как сделать stub file для сторонней установленной библиотеки, которая написана без type хинтингов?
Познавательно)
Всем привет
Не у кого не возникала проблема, что при переходе на реализацию (хочешь перейти на описание функции ctrl+клик мыши) переходит на эти pyi файлы?
Спасибо за хорошее видео. Тайпхинтинг -- хорошая штука, но есть один нюанс. Для функции `custom_sum` мы указали, что входные аргументы имеют тип `int`, и функция возвращает `int`. Но работать она будет и с `float`. А потом оказывается, что прожуёт она и `decimal.Decimal`. Ну окей, у нас есть `typing.Union` -- в чём проблема перечислить? То же касается возвращаемого результата. А потом вдруг оказывается, что допустимы и типы `numpy.*` -- их предусмотреть уже нетривиальная задача. Не менее смешно, что функция прожуёт и sqlalchemy.Column -- и как такое предусмотреть?
Итого по тайпхинтам у меня вопросов больше, чем ответов.
Ну, если так углубляться, то можно послать всё нахрен и прописать
if type(a) != 'int' or type(b) != 'int':
raise ValueError('Разраб еблан')
Оппа, python) спасибо!
Когда же Ваш курс ?
скоро-скоро
Привет, котаны!
С какой версией Python 3 доступны pyi ?
Лайк за фон
1.Разрабатываем ЯП, в котором не нужно прописывать тип переменной, радуемся тому, как круто теперь можно в любое время переменной присвоить значение любого типа и не задавать его при создании переменной.
2. Начинаем писать большие по объему сложные программные системы, начинаем терять контроль над типами, куда, что передавать, и что возвращает функция. При создании программы ide и при компиляции среда исполнения не могут нам помочь, но далее при исполнении начинает вылетать с ошибкой несоответствия типа.
3. Начинаем придумывать костыли, чтобы ПО могло проверить типы, и не надо было это делать вручную.
Знаю, умею, практикую! Только я называю это аннотациями, а не тайпхинд... тайпхент...
Виму, конечно, плевать, но мне удобнее.
За видос лайк, читаемость всегда в приоритете!
Огонь
🏃🏃🏃
надеюсь, вы не выносите описания типов из .py файлов в .pyi файлы - .pyi же только для конкретных задач, в основном типы указываются в самом .py исходнике
Это по типу заголовочных файлов в СИ что ли?
@Диджитализируй!
А можешь пояснить,а почему такое кол-во Issues в репозитории Mypy ? Может и не стоит доверять ему? ;)
Там где нет issues, там просто нет пользователей. Ну и специфика такая, пайтон динамической типизации язык, непросто там сделать хорошую проверку. Проверяторов много, там не только mypy
Спасибо за видео! Может не к месту, но чёт додо пиццу захотелось, вообще не пойму почему
Почаще ролики выпускай
Кайф. Не по РЕР-кам ли будет рубрика?) их кажется столько, что каждый можно в отдельном видео разгонять... ждем-с.
Идея хорошая, но ближайшая задумка не по PEP'ам!
Хорошая штука, но хинтинги все-таки в питоне не особо строгие, лучше уж сразу же тогда использовать языки со статической типизацией))
Hint - подсказка, они вообще не строгие, если не накручивать сверху жестких проверок через mypy или еще что-то. Языки со статической типизацией сложны не собственно тем, что надо явно указывать тип для каждой переменной, там куча других сложностей, реально замедляющих разработку
Всем привет, подскажите пж, как бороться с циклическими import при указании тайп хинтингов?
можно указывать подсказку типов как строку. Вместо:
user: User
можно так:
user: "User"
@@t0digital спасибо за ответ, ещё я нашёл вариант с TYPE_CHECKING модуля typing и __futute__.annotations чтобы можно было не указывать кавычки. Может кому пригодится
Мне как новичку в использовании аннотаций не совсем понятно вот что:
Допустим у меня есть requests библиотека. То что мне надо сделать? Самому написать pyi файлы к ней и если да, то где потом лучше всего расположить так, чтоб никого из будущих читателей кода не удивлять?
Как правило на библиотеки не пишут pyi файлы - в хороших либах уже есть прописанные типы внутри. В requests почему-то нет. Ну нет и нет, надо прописывать типы самому в своём коде. У любой переменной можно взять type(var), понять, какого она типа и прописать соответствующий тип в своём коде
Тема интересная, но есть вопрос. Когда мы импортируем сторонние библиотеки, они же помещаются в ExternalLibraries. Как быть в таком случае?
Как быть если функции с одним и тем же именем? И где ищутся соответствующие функции, внутри той же директории?
О, мастер джедай использует технику Vim в pycharme :)
Вопрос возник. Что если при полиморфном использовании функции в наследниках изменить типы входящих данных - как это отразиться на стаб файлах? Надеюсь понятно изьяснился.
Как идут дела с разработкой курса? Анкету заполнили достаточно людей?
Да. Курс в разработке
А почему нельзя в основном файле написать def custom_sum(a : int, b : int): return a + b + 123?
Можно, если ваш код не подразумевает поддержку питон 2 и если это не код внешней библиотеки, обновления которой ломать не стоит
Спасибо. Еще один вопрос закрыт.
Оставь, пожалуйста, старый фон, белый тяжёлый для глаз
А так, ты как всегда топ
Да, тут с фоном неудачно
@@t0digital спасибо большое за твое творчество!
А расскажи как возвращать dict с описанием типов {"a": 1, "b": "test", "c": {"hello": "word"}} ?
Я бы это возвращал не диктом, а через dataclass, например. Задав тип каждого атрибута в нём
Спасибо за очередное годное видео!
У меня есть вопрос. При написании кода бывает полезно создавать свои типы с помощью typing, но они часто засоряют код. Как это лучше всего делать? Как раз в этих pyi файлах?
Жду новую рубрику🤯
Спасибо! Pyi файлы только для особых случаев - код, который должен работать на 2 и 3 питоне или постановка типов для кода, внутрь которого нельзя влазить менять его. В остальных случаях целесообразно использовать type hintings внутри самого кода
@@t0digital Спасибо за ответ! Мне стало интересно, как в Джанге, например, используются type hintnig'и. Я посмотрел исходный код на гитхабе, но не увидел их там. Но IDE ведь даëт подсказки. Как так 😕
Приведите пример, какие IDE дает подсказки по типам в джанге?
@@t0digital PyCharm Community, но не везде (видимо, он сам где-то определяет); VS Code
Имею в виду что именно он подсказывает по типам джанги?
Колокольчик поставил давно. Вот как ж...й чувствовал, когда на канал подписывался, что начну писать на пайтон... И вот случилось! На работе, пишу утилиты для системы тестирования...
2020 - очередной раз объясняем людям преимущества статической типизации :)
Это не статическая типизация а тайп хинтинг, что является разными вещами
Зачем в Python .pyi файлы и чем они полезны?
За тем же, зачем в TypeScript нужны файлы *.d.ts.
Занавес, музыка из "Ералаша" (парам-пара-пам)
directed by robert b weide
На ентерпрайсе за юзаю, даже не верится что так просто и удобно.
Сделай видос о правилах для линта и про препуши если юзаешь
Если видео о pyi-файлах вообще, то хотелось бы ещё услышать в нем, что можно засунуть в тело функции кроме "...". У меня вот после просмотра остался открытый вопрос, который придется идти гуглить.
Зачем засовывать что-то в тело функции кроме многоточия? Определение функции в .py файле, в .pyi только подсказки типов
@@t0digital В том-то и вопрос. Зачем вообще оставили необходимость писать многоточие, если тело функции в этих файлах ничего не значит? Это лишние символы и место, которое ассоциируется с неким функционалом, которого на деле нет.
@@Laertid а что по-вашему должно быть на месте функции в таком случае?
@@t0digital чисто заголовок.
Хотя возможно это я так говорю потому, что с "..." не сталкивался, только с pass.
Спасибо за видео!
P.S. А где ламповый фон?(
вернётся;)
Ребят , кто знает , где будут опубликованы итоги розыгрыша книг?
через неделю-другую
@@t0digital Спасибо вам большое , что даёте обратную связь, это очень важно для нас - ваших зрителей
Алексей, MacBook поменял?
Нет, тот же, 15" 2015го года
героическое решение проблемы, которой нету в строго типизированых языках
Вы же понимаете, что в строго типизированных языках есть свои проблемы, которых нет в динамически типизированных языках?
Первый раз вижу, как Алексей пишет не в виме
Ибо на это есть причина.
Ага, прям удивилися.
Неужели решил наконец-то на ide перейти)
у него плагин стоит ideavim, так что по сути он пишет в виме
Значит не все видео смотрели) Ролик с Pycharm уже был (бизнес логика в джанго)
Это что то по типу такого ?
if type(a) == int:
........
только получается вместо такой конструкции IDE сама проверяет типы аргументов исходя из pyi файла . Лутц писал, что мол так лучше вообще не делать. Гибкость языка теряется, полиморфизм пропадает и все такое. Заранее извиняюсь если не понял.
Нет. Например, если бы не добавлялось 123, то функция работала бы и со строками - питон бы такое не запретил (если хотите, чтобы запрещал - посмотрите пакет mypy). "Кодекс это просто свод указаний, а не жестоких законов" - так же и с тайпхинтингами.
Хотелось бы также добавить, что type(a)==Class - плохой стиль, потому что наследники Class синтаксически не будут подходить, хотя код, наверное, для них тоже должен работать. Правильно использовать isinstsnce(a, Class). Хотя наследоваться от int - это удел извращенцев, такие проверки немного режут глаз
@@kaz_breaker по темной стороне силы идёшь 😆
@@fisheract в смысле?)
@@kaz_breaker ну про кодекс прозвучал как из звездных воин... Вот и процетировал :-)
@@kaz_breaker Спасибо за пояснение )
Белый фон убивает если смотреть вечером, осенью, в не самой освещенной комнате )
Мы не ищем лёгких путей! :)
stub file - файл заглушка. Хм... как звучит. Предлагаю ввести понятие crutch file - файл костыль, более распространённое явление.
01:59 Задумался и таки сказад неправильно. Всё-таки в обеих ситуациях ИЛИ в обОих случаях. С уважением
потому что:
мужской род - оба
женский род - обе
Да-да
Увы, это костыли из-за динамической типизации в питоне. В C++, компилятор и IDE сразу покажут ошибку, без лишнего мусора в виде файлов тайп хинтингов.
наверное, потому что python - динамически типизированный язык, а плюсы - статически
@@AB-yl5xi не наверное, а точно))
Это не костыли. Такие type hints (включая py стабы) в динамических языках носят лишь рекомендательный характер и в целом можно положить на них болт, так и на их варнинги, и писать как захочешь. В статических же, это обязаловка, которая иногда очень напрягает и замедляет разработку.
И там и там есть минусы и плюсы, а все эти споры вокруг языков и их возможностей, это какое-то самоутверждение школьников в пубертатном периоде. Если вы (и не только вы) такие умные, пиши реализацию spatio-themporal трехголового anchor free детектора на плюсах, а высоконагруженный сервис с минимальным latency на python, тогда видимо костыли перестанут мерещиться.
@@Tantal180 вокруг языков никто не спорит, но возможность "рекомендательно" указывать типы и класть на них болт можно и без этих файлов, а явно в самом коде.
у меня колокольчик на взводе, не грусти
О, отлично :)
А гоуланг будем учить?
Будем!