Я выполняю упражнение по добавлению подсказок типов в большую базу кода, но иногда вижу, что неоптимальные подсказки типов ухудшают рекомендации IDE:
Раньше IDE могла определить, что y['result'] — это строка:
После этого он не знает:
Я знаю, что мог бы исправить это с помощью более конкретной подсказки типа:
Но в целом, есть ли способ узнать, является ли добавляемая подсказка типа менее конкретной, чем то, что LSP смог вывести из кода?
Я хотел добавить очень подробные подсказки типов, чтобы избежать этой проблемы (например, создать подкласс TypeDict), но мне хотелось бы избежать этих усилий, если LSP сможет разобраться во всем сам.
Я спрашиваю, есть ли способ предупредить пользователя, когда он добавляет подсказку типа, которая ухудшит понимание кода LSP:
У нас есть предупреждения, когда подсказки типов противоречат коду:
Мне нужно предупреждение, когда подсказка типа хуже, чем отсутствие подсказки типа вообще.
Здесь вы можете видеть, что LSP легко смог определить довольно подробный тип возвращаемого значения.
Это было бы потеряно, если бы пользователь добавил подсказку «плохого» типа.
Но я принимаю общий отзыв. Возможно, это вопрос к проекту Pylance, а не вопрос о переполнении стека.
Я также не уверен, что можно достоверно определить, что подсказка «хуже». Откуда мы знаем, что это действительно «хуже», а не «точнее» — что указанный человеком dict[Any, Any] (когда просто набираешь dict) не является фактически правильным типом и что использование постоянных данных, где значение было str не был ли это особый случай, который не является репрезентативным для более общего случая того, что нужно обрабатывать?
Отмечу, что иногда полезно спросить у средства проверки типов (например, reveal_type в mypy), какой, по его мнению, тип значения является наиболее общим, прежде чем добавлять явные подсказки типа.
что такое reveal_type? Возможно, это и есть ответ...
reveal_type раньше было расширением проверки типов, но теперь это просто обычная функция в typing. Вы можете использовать его, чтобы узнать у средства проверки типов выведенный тип. Обратите внимание, что это может отличаться от того, что думает LSP (в общем, подсказки типов предназначены для проверки типов, а их помощь в ваших предложениях IDE — это просто бонус для тех, кто в ней нуждается).
Если бы вы использовали Helix в качестве редактора, последовательность вопросов, какой тип вашего langserver считает чем-то, была бы пробел+k. Я понятия не имею, что это такое в VS Code или откуда сделан скриншот.
Я голосую за закрытие этого вопроса, потому что он не фокусируется на одной конкретной проблеме.
Конечно, рад, что вы закрыли его. Но я думаю, что в Интернете нет подходящего места, где можно задавать подобные вопросы (Reddit — гораздо худший вариант, чем SO). Стремлюсь к тому, чтобы ТАК развиваться в направлении вопросов и ответов по общей разработке программного обеспечения.
Я думаю, что этот вопрос справедлив, потому что реальность такова, что интерфейс IS реализован во многих крупных/устаревших кодовых базах. Я добавил ответ, в котором описывается, как поэтапный подход может смягчить проблему, с которой вы столкнулись.
Пожалуйста, просмотрите Почему бы не загружать изображения кода/ошибок, когда задаете вопрос? (например, «Изображения следует использовать только для иллюстрации проблем, которые невозможно объяснить другим способом, например, для предоставления снимков экрана пользовательского интерфейса»). Заранее спасибо.
Привет, Питер, спасибо за ваш отзыв, но вы можете видеть, что отзывы LSP лучше всего иллюстрируются изображениями, которые дополняют общее объяснение.






dict эквивалентно dict[Any, Any]. Подсказки по типу всегда переопределяют логический вывод, поэтому вы заменили возможность сделать вывод о том, что y['result'] имеет тип str, на констатированный факт, что y['result'] имеет тип Any.
Решение этой проблемы по своей сути зависит от инструмента, но, например, mypy имеет опцию --disallow-any-generic, которая сама по себе пометит dict как ошибку. При использовании этого параметра универсальные типы должны иметь явные «аргументы», указывающие способ привязки параметров. Если вы действительно хотите dict[Any, Any], вы можете написать это, но вы не можете просто использовать dict как сокращение.
ОП уже знает это — в вопросе они утверждают, что dict[str, str] решит проблему.
Они поняли решение, но не было ясно, почему они поняли, почему это было решение (или для какой именно проблемы оно было решением). Кроме того, они попросили найти способ пометить один dict как проблему.
Однако я согласен, что невозможно пометить произвольный тип, например object, как «слишком разрешительный».
Для наглядности да, я понимаю, почему dict ухудшает рекомендации. Суть моей проблемы заключается в том, что когда члены моей команды добавляют «подсказки типа» в запросы на включение, не очевидно, является ли добавленная ими подсказка типа лучше или хуже того, что было очевидно для LSP/проверки типов. Мне нужен способ отмечать, когда пользователь добавил подсказку типа, вы знаете... плохой.
@MYK, я не думаю, что существует достаточно объективное определение «плохого», чтобы langserver мог его узнать. Да, он больше не предлагает результаты, специфичные для строки, но, возможно, это правильное и предполагаемое поведение, поскольку строка — это лишь один из многих возможных типов, которые могут храниться в этом ключе. disallow-any-generic и его альтернативы другим инструментам действительно наиболее близки к вам.
... все будет по-другому в языке, где типы определяются во время компиляции и строго соблюдаются - для этих языков да, компилятор может делать утвердительно правильные утверждения - но там у вас будут утверждения типов или объявления типов, а не просто вводите подсказки, в первую очередь!
Я думаю, что мой последний пример - единственный хороший пример, иллюстрирующий проблему (см. EDIT # 2), там есть довольно хорошая подсказка типа, которая может быть получена из кода функции, и менее хороший «кортеж», который может использовать пользователь. добавлять.
Нет, в настоящее время средство проверки типов не может сказать вам, ухудшит ли ваша подсказка понимание LSP. Как в вашем примере кода Visual Studio (в котором используется Pyright ), так и mypy.
Хотя реализация средств проверки типов теоретически возможна, необходимость в этой функции является тревожным сигналом. Это связано с тем, что ваш LSP должен предоставлять предложения, основанные на интерфейсе функции (тип возвращаемого значения), а не на реализации (тело функции). В противном случае ваш LSP будет предлагать предложения, которые не будут работать при изменении реализации используемой вами функции, даже если ее поведение останется прежним!
Ты говоришь:
Я выполняю упражнение по добавлению подсказок типов в большую кодовую базу.
Если вы хотите, чтобы ваш LSP сохранял оптимальное понимание кода, вам следует начинать добавлять подсказки типов только к функциям, которые используются другими модулями/пакетами в вашем коде. Это позволит получить основное преимущество подсказки типов (установление интерфейса с другими членами команды/потребителями вашего сервиса).
Что касается приватных функций, вам пока не нужно вводить подсказки. Это позволяет рассматривать их реализацию как интерфейс, что неплохо для внутреннего кода. Недостаток подсказки типа, с которым вы сталкиваетесь (вероятность случайного удаления информации из интерфейса), тогда откладывается.
Я не уверен, что запросы функций langserver хорошо подходят для переполнения стека. Лучше подать заявку на языковой сервер, который вы используете. (Кроме того, если вы используете VS Code, насколько я понимаю, обычный langserver — этоpyright-langserver или pylance, не поддерживающий OSS, а не pylsp-mypy — учитывая пометку вопроса, вы явно настроили последний?)