Как VS Code получает подсказки типа? - PullRequest
0 голосов
/ 31 марта 2020

Я использовал 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 Ответ

1 голос
/ 31 марта 2020

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

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

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

Вы можете увидеть специфику c типы 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 ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...