简单的回答:type
参数对add_argument
默认为None
,而不是str
.
不那么简短的回答:一个类型的None
behaves像一个类型的str
,但不工作与MetaVarTypeHelpFormatter
.
MetaVarTypeHelpFormatter
要求每个参数都有一个显式类型.
argParser.add_argument("models", default='', nargs='+', type=str,
help="Which model(s) to execute")
它的文档化目的是使用参数的type
属性的名称作为元变量,该属性默认为None
.
虽然参数的默认类型是str
,但这只是意味着如果参数的type
属性是None
,则保留从参数列表中提取的str
值,或者如果不是None
,则转换为给定类型.
>>> p = argparse.ArgumentParser()
>>> print(p.add_argument("foo").type)
None
>>> print(p.add_argument("foo", type=int).type)
<class 'int'>
每个解析器都维护一个type registry,这意味着您可以将自己的任意值映射添加到可调用程序中以生成类型.例如,
>>> import argparse
>>> p = argparse.ArgumentParser()
>>> p.register('type', 'lowercase', lambda x: x.lower())
>>> p.add_argument("foo", type='lowercase')
_StoreAction(option_strings=[], dest='foo', nargs=None, const=None, default=None, type='lowercase', choices=None, required=True, help=None, metavar=None)
>>> p.parse_args(["HELLO WORLD"])
Namespace(foo='hello world')
最初,类型注册表中的条目映射None
到
def identity(string):
return string
这就是为什么带有"type"None
的参数的行为就像你显式地提供了str
.
类型注册表没有被文档化,除了这个条目之外,它也不会被再次使用,因此不清楚它为什么存在.作者可能有计划使用它更多从未实现.(请注意,每个解析器都有一个操作注册表,它被使用得更频繁,这就是为什么你可以指定操作'append'
和'store_const'
,而不是直接指定非公共类_AppendAction
和_StoreConstAction
.