С argparse
Я хотел бы иметь возможность смешивать дополнительные параметры с несколькими позиционными параметрами, например, как svn
позволяет:argparse необязательный параметр в позиционной
svn ls first/path -r 1000 second/path
На данный момент, это официально не поддерживается Python (cf http://bugs.python.org/issue14191). Я написал это обходное решение, и теперь мне интересно, если a) есть лучший/более простой/более элегантный способ сделать это, и b) если кто-то может увидеть что-то в коде, которое может сломать его при определенных условиях:
#!/usr/bin/env python3
import argparse as ap
p = ap.ArgumentParser()
p.add_argument('-v', action='store_true')
p.add_argument('-l', action='store_true')
p.add_argument('files', nargs='*', action='append')
p.add_argument('remainder', nargs=ap.REMAINDER, help=ap.SUPPRESS)
args = p.parse_args()
while args.remainder != []:
args = p.parse_args(args.remainder, args)
print(args)
пример
Использование:
./test.py a b -v c d
Выход:
Namespace(files=[['a', 'b'], ['c', 'd']], l=False, remainder=[], v=True)
Существует версия обходного пути в 14191, которую вы можете загрузить и добавить в свой код - без изменения вашего 'argparse'. Это может понадобиться вам, если вам нужно определить больше «позиций». – hpaulj