Порядок аргументов argparse

У меня небольшая проблема.

Я использую argparse для анализа моих аргументов, и он работает очень хорошо.

Чтобы получить аргументы, я использую:

p_args = parser.parse_args(argv)
args = dict(p_args._get_kwargs())

Но проблема с p_args заключается в том, что я не знаю, как получить эти аргументы, упорядоченные по их положению в командной строке, потому что это dict .

Так есть ли возможность иметь аргументы в кортеже / списке / упорядоченном слове по порядку в командной строке?

17
задан igaurav 3 October 2014 в 13:32
поделиться

1 ответ

Это - мое простое решение на основе существующих:

class OrderedNamespace(argparse.Namespace):
    def __init__(self, **kwargs):
        self.__dict__["_order"] = [None]
        super().__init__(**kwargs)
    def __setattr__(self, attr, value):
        super().__setattr__(attr, value)
        if attr in self._order:
            self.__dict__["_order"].clear()
        self.__dict__["_order"].append(attr)
    def ordered(self):
        if self._order and self._order[0] is None:
            self._order.clear()
        return ((attr, getattr(self, attr)) for attr in self._order)

parser = argparse.ArgumentParser()
parser.add_argument('--test1', default=1)
parser.add_argument('--test2')
parser.add_argument('-s', '--slong', action='store_false')
parser.add_argument('--test3', default=3)

args = parser.parse_args(['--test2', '2', '--test1', '1', '-s'], namespace=OrderedNamespace())

print(args)
print(args.test1)
for a, v in args.ordered():
    print(a, v)

Вывод:

OrderedNamespace(_order=['test2', 'test1', 'slong'], slong=False, test1='1', test2='2', test3=3)
1
test2 2
test1 1
slong False

Это позволяет действия в add_argument (), который более труден для специализированного решения для класса действия.

0
ответ дан 30 November 2019 в 13:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: