Как VS-код получает подсказки по типу?

#python #type-hinting #python-typing

Вопрос:

Я использовал argparse в проекте, когда заметил следующее:

  • VS Код показывает подсказки типа для аргументов ArgumentParser.add_argument :
     add_argument(*name_or_flags: Text, action: Union[Text, Type[Action]]=..., nargs: Union[int, Text]=..., const: Any=..., default: Any=..., type: Union[Callable[[Text], _T], Callable[[str], _T], FileType]=..., choices: Iterable[_T]=..., required: bool=..., help: Optional[Text]=..., metavar: Optional[Union[Text, Tuple[Text, ...]]]=..., dest: Optional[Text]=..., version: Text=..., **kwargs: Any) -> Action
    param *name_or_flags: Text
    
    add_argument(dest, ..., name=value, ...)
    add_argument(option_string, option_string, ..., name=value, ...)
     
  • Исходный код argparse не содержит этих подсказок (https://github.com/python/cpython/blob/master/Lib/argparse.py ):
         # =======================
        # Adding argument actions
        # =======================
        def add_argument(self, *args, **kwargs):
            """
            add_argument(dest, ..., name=value, ...)
            add_argument(option_string, option_string, ..., name=value, ...)
            """
    
            # if no positional args are supplied or only one is supplied and
            # it doesn't look like an option string, parse a positional
            # argument
     

Как бы я написал функцию в своем собственном коде, которая показывает подсказки типа таким же образом (т. Е. Функция, которую я пишу, имеет в качестве аргументов *args и **kwargs, но любой пользователь функции может видеть имена и типы ожидаемых kwargs)?

Ответ №1:

Эта информация о типе поступает из набора:

Typeshed содержит аннотации внешних типов для стандартной библиотеки Python и встроенных модулей Python, а также пакеты сторонних разработчиков, предоставленные внешними участниками этих проектов.

Эти данные могут, например, использоваться для статического анализа, проверки типа или вывода типа.

Вы можете ознакомиться с конкретными типами add_argument здесь:

 def add_argument(self,
                 *name_or_flags: Text,
                 action: Union[Text, Type[Action]] = ...,
                 nargs: Union[int, Text] = ...,
                 const: Any = ...,
                 default: Any = ...,
                 type: Union[Callable[[Text], _T], Callable[[str], _T], FileType] = ...,
                 choices: Iterable[_T] = ...,
                 required: bool = ...,
                 help: Optional[Text] = ...,
                 metavar: Optional[Union[Text, Tuple[Text, ...]]] = ...,
                 dest: Optional[Text] = ...,
                 version: Text = ...,
                 **kwargs: Any) -> Action: ...
 

Для вашего собственного кода вы можете просто добавить эти подсказки типа напрямую, если вам не нужно поддерживать более старые версии Python (синтаксис доступен от 3,0 для PEP-3107, typing модуль доступен от 3,5 для PEP-0484).