我不知道PyCharm是如何处理这些类型提示的,但是了解Namespace代码。在
argparse.Namespace是一个简单的类;本质上是一个带有一些方法的对象,这些方法使查看属性更容易。为了便于单元测试,它有一个__eq__方法。您可以阅读argparse.py文件中的定义。在
parser以最一般的方式与名称空间交互-使用getattr,setattr,hasattr。因此,您几乎可以使用任何dest字符串,即使是不能使用.dest语法访问的字符串。在
请确保不要混淆add_argumenttype=参数;这是一个函数。在
使用您自己的namespace类(从头开始或子类化)可能是最好的选择。文档中对此进行了简要描述。Namespace Object。我还没见过这么做,尽管我已经建议过几次来处理特殊的存储需求。所以你必须做实验。在
注意违约处理。大多数argparse操作的默认默认值是None。如果用户没有提供这个选项,在解析之后使用它来做一些特殊的事情是很方便的。在if args.foo is None:
# user did not use this optional
args.foo = 'some post parsing default'
else:
# user provided value
pass
这可能会妨碍类型提示。无论您尝试什么解决方案,请注意默认值。在
namedtuple不能作为Namespace工作。在
首先,自定义命名空间类的正确使用是:
^{pr2}$
也就是说,初始化该类的一个实例,并将其作为参数传递。返回的args将是同一个实例,具有通过解析设置的新属性。在
第二,namedtuple只能创建,不能更改。在In [72]: MagicSpace=namedtuple('MagicSpace',['foo','bar'])
In [73]: nm = MagicSpace(1,2)
In [74]: nm
Out[74]: MagicSpace(foo=1, bar=2)
In [75]: nm.foo='one'
...
AttributeError: can't set attribute
In [76]: getattr(nm, 'foo')
Out[76]: 1
In [77]: setattr(nm, 'foo', 'one') # not even with setattr
...
AttributeError: can't set attribute
命名空间必须与getattr和setattr一起使用。在
namedtuple的另一个问题是它没有设置任何类型的type信息。它只定义字段/属性名。所以没有什么可供静态类型检查的。在
虽然很容易从parser中获得预期的属性名,但无法获得任何预期的类型。在
对于简单的解析器:In [82]: parser.print_usage()
usage: ipython3 [-h] [-foo FOO] bar
In [83]: [a.dest for a in parser._actions[1:]]
Out[83]: ['foo', 'bar']
In [84]: [a.type for a in parser._actions[1:]]
Out[84]: [None, None]
Actionsdest是普通属性名。但是type不是该属性的预期静态类型。它是一个可以或不可以转换输入字符串的函数。这里None表示输入字符串按原样保存。在
因为静态类型和argparse需要不同的信息,所以没有一种简单的方法从另一种信息中生成一种。在
我认为您能做的最好的方法是创建自己的参数数据库,可能是在字典中,然后使用自己的实用函数从中创建Namespace类和parsesr。在
假设dd是带有必要键的字典。然后我们可以创建一个参数:parser.add_argument(dd['short'],dd['long'], dest=dd['dest'], type=dd['typefun'], default=dd['default'], help=dd['help'])
您或其他人必须想出一个名称空间类定义来设置default(简单)和静态类型(硬?)从这样的字典里。在