У меня небольшая проблема.
Я использую argparse
для анализа моих аргументов, и он работает очень хорошо.
Чтобы получить аргументы, я использую:
p_args = parser.parse_args(argv)
args = dict(p_args._get_kwargs())
Но проблема с p_args
заключается в том, что я не знаю, как получить эти аргументы, упорядоченные по их положению в командной строке, потому что это dict .
Так есть ли возможность иметь аргументы в кортеже / списке / упорядоченном слове по порядку в командной строке?
Это - мое простое решение на основе существующих:
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 (), который более труден для специализированного решения для класса действия.