比自定义名称空间更好的为argparse参数提供类型提示的选项

时间:2019-06-04 09:42:16

标签: python argparse typing mypy typehints

我正在尝试使用mypy输入检查程序。该程序使用argparse解析命令行参数。我想为命令行参数添加类型提示。

import argparse
import typing


# define example types and a function that uses them
Seconds = typing.NewType("Seconds", float)
Minutes = typing.NewType("Minutes", float)

def sec_to_min(s: Seconds) -> Minutes:
    return Minutes(s / 60)

# specify arguments and parse them
parser = argparse.ArgumentParser()
parser.add_argument("-t", "--time", default=1., type=float,
                    help="time in seconds")
args = parser.parse_args()

try:
    # mypy reveals type Any
    reveal_type(args.time)
except NameError:
    pass


# (1) passes type check
seconds: Seconds = args.time
# (2) passes type check
sec_to_min(args.time)

我希望mypy将args.time识别为Seconds。当前代码应将args.time识别为浮点,并抱怨,因为也将浮点传递给sec_to_min会抱怨。

我尝试将type的{​​{1}}参数更改为add_argument。这没有任何效果,mypy仍将type=lambda x: Seconds(float(x))标识为args.time
here所述,我还尝试提供了自定义名称空间。这将显示的类型any更改为args.time。我想避免这种情况,因为我必须为每个参数重复名称,并且Seconds的默认值会被自定义名称空间覆盖。

add_argument

0 个答案:

没有答案