argparse
不使用action
当应用default
。它只是使用setattr
。它可能会使用type
如果默认是字符串。但你可以调用action
直接地。
这里我使用了从文档中借用的自定义操作类。在第一个parse_args
什么都没发生。然后我创建一个新的namespace
,并调用默认操作。然后我将该命名空间传递给parse_args
。要理解这一点,您需要将其导入交互式 shell,并检查命名空间和操作的属性。
# sample custom action from docs
class FooAction(argparse.Action):
def __call__(self, parser, namespace, values, option_string=None):
print('Setting: %r %r %r' % (namespace, values, option_string))
setattr(namespace, self.dest, 'action:'+values)
p = argparse.ArgumentParser()
a1 = p.add_argument('--foo', action=FooAction, default='default')
print 'action:',a1
print p.parse_args([])
ns = argparse.Namespace()
a1(p, ns, a1.default, 'no string') # call action
print p.parse_args([],ns)
print p.parse_args(['--foo','1'],ns)
其产生:
action: FooAction(option_strings=['--foo'], dest='foo', nargs=None, const=None, default='default', type=None, choices=None, help=None, metavar=None)
Namespace(foo='default')
Setting: Namespace() 'default' 'no string'
Namespace(foo='action:default')
Setting: Namespace(foo='action:default') '1' '--foo'
Namespace(foo='action:1')
我定制了输出以突出显示何时使用该操作。
这是一种对命令行上未给出的参数(或给定值 == 为默认值)执行特殊操作的方法。这是给出的类的简化https://stackoverflow.com/a/24638908/901925 https://stackoverflow.com/a/24638908/901925.
class Parser1:
def __init__(self, desc):
self.parser = argparse.ArgumentParser(description=desc)
self.actions = []
def milestone(self, help_='milestone for latest release.', default=None):
action = self.parser.add_argument('-m', '--milestone', help=help_, default=default)
self.actions.append(action)
return self
def parse(self):
args = self.parser.parse_args()
for a in self.actions:
if getattr(args, a.dest) == a.default:
print 'Please specify', a.dest
values = raw_input('>')
setattr(args, a.dest, values)
return args
print Parser1('desc').milestone(default='PROMPT').parse()
提示完成后parse_args
。我看不出有什么理由打电话parse_args
again.