导致Python的argparse执行默认操作

Max*_*chi 13 python argparse

我正在使用argparse的动作将各种数据添加到类中.如果命令行没有提供arg,我想在默认值上使用该操作.这可能吗?谢谢!

hpa*_*ulj 6

argparseaction申请时不使用default.它只是使用setattr.type如果默认值是字符串,则可以使用if.但你可以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)
Run Code Online (Sandbox Code Playgroud)

产生:

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')
Run Code Online (Sandbox Code Playgroud)

我定制了输出以突出显示何时使用该动作.


这是一种对命令行未给出的参数执行特殊操作的方法(或者使用值==给出默认值).这是/sf/answers/1724723591/中给出的类的简化.

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()
Run Code Online (Sandbox Code Playgroud)

提示在之后完成parse_args.我没有理由parse_args再次打电话.

  • 您的解决方案的关键点是`p.add_argument`返回操作 - 为什么没有记录:https://docs.python.org/2.7/library/argparse.html#the-add-argument-method? (2认同)