python命名空间更改手机型号_Python:类型提示argparse.命名空间物体

我不知道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(简单)和静态类型(硬?)从这样的字典里。在

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值