如何切换布尔argparse选项?

时间:2018-04-24 18:51:13

标签: python python-3.x argparse configparser

我试图将configparser和argparse组合成一个脚本,以便argparse定义的各种参数的默认值存储在通过configparser操作的配置文件中。我遇到的问题是布尔选项。 argparse对这些选项执行store_truestore_false操作,这些操作会自动创建默认值并指定在给出选项时要更改的内容。但是,由于从配置文件中读取了默认值,因此我不能提前知道它是什么,以便使用这些操作。这可能意味着:

import argparse,configparser

config = configparser.ConfigParser()
config['DEFAULT']['test'] = 'False'
config.read('testing.cfg')

parser = argparse.ArgumentParser()

if config.getboolean('DEFAULT','test'):
    parser.add_argument('-t',action='store_false', dest='test')
else:
    parser.add_argument('-t',action='store_true', dest='test')

args = parser.parse_args()

print(args.test)

但是,我不喜欢在条件中包含parser.addargument语句的想法(尤其是我所拥有的这些选项中的繁琐)。我更喜欢的是:

parser.add_argument('-t',action='toggle_boolean',dest='test',default=config.getboolean('DEFAULT','test'))

在这个例子中,当给出参数时,toggle_boolean动作将切换布尔值的状态,无论它发生什么。问题是所述行动(toggle_boolean)不存在。我将如何定义此类操作,或者有更好的方法来执行此操作?

1 个答案:

答案 0 :(得分:2)

store_truestore_falsestore_const的特殊情况:

In [213]: parser = argparse.ArgumentParser()
In [214]: foo = True
In [215]: parser.add_argument('-s', action='store_const', default=foo, const=not(foo))
In [216]: parser.add_argument('-n', action='store_const', default=not(foo), const=foo);

In [218]: parser.parse_args([])
Out[218]: Namespace(n=False, s=True)

In [219]: parser.parse_args(['-s','-n'])
Out[219]: Namespace(n=True, s=False)