使用 argparse
我希望能够将可选参数与多个位置参数混合,例如,svn
允许:
svn ls first/path -r 1000 second/path
目前,Python 还没有正式支持它(c.f. 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)
你可以使用 parse_known_args而不是包含 remainder
:
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')
args, unknown = p.parse_known_args()
while unknown:
args, unknown = p.parse_known_args(unknown, args)
print(args)
产量
Namespace(files=[['a', 'b'], ['c', 'd']], l=False, v=True)
我是一名优秀的程序员,十分优秀!