如何切换布尔 argparse 选项?

rps*_*uel 8 python configparser argparse python-3.x

我试图将 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)
Run Code Online (Sandbox Code Playgroud)

parser.addargument但是,我不喜欢在条件中包含语句的想法(尤其是我拥有的这些选项越多,就越麻烦)。我更喜欢的是这样的:

parser.add_argument('-t',action='toggle_boolean',dest='test',default=config.getboolean('DEFAULT','test'))
Run Code Online (Sandbox Code Playgroud)

在这种情况下,toggle_boolean当给出参数时,该操作将切换布尔值的状态,无论它是什么。问题是所述操作 ( toggle_boolean) 不存在。我将如何定义这样的操作,或者是否有更好的方法来做到这一点?

hpa*_*ulj 8

store_true并且store_false是以下的特殊情况store_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)
Run Code Online (Sandbox Code Playgroud)

  • 我建议写“not foo”,而不是类似函数的“not(foo)”。它可能不会在这里造成问题,但这种习惯会导致意外,比如写“not(x) in y”并期望它的行为像“(not x) in y”而不是“not (x in y)” 。 (3认同)