Как включить булеву опцию argparse? - PullRequest
0 голосов
/ 24 апреля 2018

Я пытаюсь объединить configparser и argparse для скрипта так, чтобы значения по умолчанию для различных аргументов, определенных argparse, сохранялись в файле конфигурации, которым манипулируют через configparser. Проблема, с которой я сталкиваюсь, связана с булевыми опциями. Для этих опций argparse имеет действия store_true и store_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 голосов
/ 24 апреля 2018

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)
...