Установка значения по умолчанию для необязательного аргумента, который зависит от другого необязательного аргумента в python argparse - PullRequest
0 голосов
/ 28 апреля 2020

Я использую python argparse() для разбора командной строки. Я хочу что-то вроде этого,

-a -> необязательный аргумент

-b -> необязательный аргумент, который зависит от a с default value x

Условие : -b должно быть установлено (либо default, либо пользовательское значение), если и только если установлено a, в противном случае b должно быть None.

Может ли кто-нибудь помочь мне добиться этого?

1 Ответ

1 голос
/ 05 мая 2020
Комментарий

@hpaulj остается в силе. Лучше всего это делать в коде после анализа

Но вы можете сделать это с @property и вашим собственным MyNamespace объектом вместо пространства имен argparse по умолчанию

@property позволяет вам писать произвольный код для методов получения / установки определенного объекта класса (в данном случае b)

class MyNamespace(object):
    def __init__(self):
        self.a = None
        self._b = None   # this is a variable to store the actual value of -b

    @property
    def b(self):
        if self.a:
            return "A_IS_SET"
        else:
            return self._b or None
    @b.setter
    def b(self, input):
        self._b = input

def parse():
    parse.avalue = []
    parse.bvalue = []

    parser = argparse.ArgumentParser()
    parser.add_argument("-a")
    parser.add_argument("-b")

    out = parser.parse_args(namespace=MyNamespace())
    print out.a, out.b

if __name__ == "__main__":
    parse()
Когда оба a, b переданы (в любом порядке)
$>python testparse.py -b BTEST -a atest
atest A_IS_SET
$>python testparse.py -a atest -b BTEST
atest A_IS_SET
Когда передается только -b
$>python testparse.py -b BTEST 
None BTEST
Когда только -a пройдено
$>python testparse.py -a atest
atest A_IS_SET
Когда ни один из них не пройден
$>python testparse.py
None None

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...