【问题标题】:How to toggle a boolean argparse option?如何切换布尔 argparse 选项?
【发布时间】:2018-04-24 18:51:12
【问题描述】:

我正在尝试将 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) 不存在。我将如何定义这样的操作,或者有更好的方法吗?

【问题讨论】:

    标签: python python-3.x argparse configparser


    【解决方案1】:

    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)
    

    【讨论】:

    • 完美。不需要新的代码行,完全符合我的需要。
    • 我建议写not foo,而不是类似函数的not(foo)。它可能不会在这里造成问题,但这种习惯会导致意外,例如写 not(x) in y 并期望它的行为类似于 (not x) in y 而不是 not (x in y)
    猜你喜欢
    • 2012-07-21
    • 2019-02-23
    • 1970-01-01
    • 1970-01-01
    • 2014-01-15
    • 1970-01-01
    • 2021-09-02
    • 1970-01-01
    • 2015-05-09
    相关资源
    最近更新 更多