gpt4 book ai didi

python - 使 Python 的 argparse 执行默认操作

转载 作者:太空狗 更新时间:2023-10-29 18:08:15 26 4
gpt4 key购买 nike

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

最佳答案

argparse 在应用 default 时不使用 action。它只使用 setattr。如果默认为字符串,它可能会使用 type。但是您可以直接调用 action

这里我使用了从文档中借用的自定义操作类。在第一个 parse_args 中没有任何反应。然后我创建一个新的 namespace,并调用默认的操作。然后我将该 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 中给出的类的简化。 .

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

关于python - 使 Python 的 argparse 执行默认操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21583712/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com