Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为argparse参数提供类型提示的更好选项,而不是自定义命名空间_Python_Argparse_Typing_Mypy_Typehints - Fatal编程技术网

Python 为argparse参数提供类型提示的更好选项,而不是自定义命名空间

Python 为argparse参数提供类型提示的更好选项,而不是自定义命名空间,python,argparse,typing,mypy,typehints,Python,Argparse,Typing,Mypy,Typehints,我正在尝试使用mypy来检查我的程序。程序使用argparse解析命令行参数。我想为命令行参数添加类型提示 import argparse 导入键入 #定义示例类型和使用它们的函数 秒=键入.NewType(“秒”,浮点) 分钟=键入.NewType(“分钟”,浮点) def秒到分钟(秒)->分钟: 返程时间(s/60) #指定参数并解析它们 parser=argparse.ArgumentParser() add_参数(“-t”,“--time”,默认值为1,类型为float, help=“以

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

import argparse
导入键入
#定义示例类型和使用它们的函数
秒=键入.NewType(“秒”,浮点)
分钟=键入.NewType(“分钟”,浮点)
def秒到分钟(秒)->分钟:
返程时间(s/60)
#指定参数并解析它们
parser=argparse.ArgumentParser()
add_参数(“-t”,“--time”,默认值为1,类型为float,
help=“以秒为单位的时间”)
args=parser.parse_args()
尝试:
#mypy显示任何类型
显示类型(参数时间)
除名称错误外:
通过
#(1)通过型式检验
秒:秒=args.time
#(2)通过型式检验
秒至分钟(参数时间)
我希望mypy将
args.time
识别为
Seconds
。当前代码应将
args.time
识别为浮点和投诉,因为将浮点传递给
sec\u to_min
也会投诉

我尝试将
add_argument
type
参数更改为
type=lambda x:Seconds(float(x))
。这没有效果,mypy仍然将
args.time
识别为
any

如前所述,我还尝试提供一个自定义名称空间。这将显示的
args.time
类型更改为
Seconds
。我希望避免这种情况,因为我必须为每个参数复制名称,并且自定义名称空间将覆盖
add\u argument
中的默认值

class TypedNameSpace(argparse.Namespace):
定义初始化(self,*args,**kwargs):
self.time:秒=秒(0.)
super(TypedNameSpace,self)。\uuuuuu init\uuuuuu(*args,**kwargs)

argparse
type
参数是一个函数,用于将字符串转换为某些内容,如果不能转换,则会引发错误。它不添加类型提示信息。值放置在具有通用
setattr
的命名空间中。我怀疑mypy是否可以通过argparse代码跟踪此操作。@hpaulj我知道,我只是希望在搜索中遗漏一些东西。似乎添加类型提示的唯一方法是复制参数;两年前,我给出了一个更长的答案,但基本思想是一样的。我倾向于避免使用像argparse这样的工具,而是手动执行命令行参数解析。像mypy或pylint这样的东西更容易检查。不过,一旦argparse的风险降低,我很乐意切换到argparse。