#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).