我正在尝试使用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