Python: 参数解析器 - 允许不带“--”的多个参数,不需要
Python: argument parser - multiple arguments without "--" allowed, not required
我正在努力编写一个简单的 python 脚本(一个伪 git),这将允许我从 commandline/shell 使用这样的命令调用它:
$ python script.py init
我在网上找到了一些解决方案,使我能够这样做,但问题不大。我希望 "add" 函数也接受其他参数(通常是字符串,代表文件名)。
我找到了解决方法,但看起来不太好。有没有办法重构代码,以便 "add" 也接受其他参数并让我稍后访问它们?重要的事情:我不希望它们用“--”添加,我宁愿通过简单地在两个参数之间添加 space 来分隔它们。
我在 add_argument 中找到了“nargs='+' 选项,但我不知道如何重定向参数以调用正确的函数。
这是我到目前为止编写的代码:
import argparse
import sys
def init():
print("init method call")
def add():
if(len(sys.argv)>2):
print("valid add method call")
else:
print("invalid call")
def commit():
print("commit method call")
def status():
print("status method call")
def test():
print("test method call")
FUNCTION_MAP = {'init' : init,
'status' : status,
'commit': commit}
if __name__ == '__main__':
if(len(sys.argv)>1 and sys.argv[1] == "add"):
add()
else:
parser = argparse.ArgumentParser()
parser.add_argument('command', choices=FUNCTION_MAP.keys())
args = parser.parse_args()
func = FUNCTION_MAP[args.command]
func()
这里有 2 个选项 - 取一个额外的位置,然后使用或忽略这些值。或者使用子解析器。
import argparse
def add(args):
print("add:", args)
def status(args):
values = getattr(args,'values',None)
if values and len(values)>0:
# error message and method of your choice
print('oops - got values', args)
print("status method call")
FUNCTION_MAP = {'add' : add,
'status' : status}
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('command', choices=FUNCTION_MAP.keys())
parser.add_argument('values', nargs='*')
args = parser.parse_args()
func = FUNCTION_MAP[args.command]
func(args)
print('\nWIth subparsers')
parser = argparse.ArgumentParser()
sp = parser.add_subparsers(dest='command')
spp = sp.add_parser('add')
spp.add_argument('values', nargs='*')
spp = sp.add_parser('status')
args = parser.parse_args()
func = FUNCTION_MAP[args.command]
func(args)
样本运行
1906:~/mypy$ python3 stack49691897.py add 1 2 3
add: Namespace(command='add', values=['1', '2', '3'])
WIth subparsers
add: Namespace(command='add', values=['1', '2', '3'])
1907:~/mypy$ python3 stack49691897.py status
status method call
WIth subparsers
status method call
1907:~/mypy$ python3 stack49691897.py status 1 2 3
oops - got values Namespace(command='status', values=['1', '2', '3'])
status method call
WIth subparsers
usage: stack49691897.py [-h] {add,status} ...
stack49691897.py: error: unrecognized arguments: 1 2 3
argparse 文档还演示了一种使用子解析器和默认值的方法,可以有效地实现您的 FUNCTION_MAP
。
我正在努力编写一个简单的 python 脚本(一个伪 git),这将允许我从 commandline/shell 使用这样的命令调用它:
$ python script.py init
我在网上找到了一些解决方案,使我能够这样做,但问题不大。我希望 "add" 函数也接受其他参数(通常是字符串,代表文件名)。
我找到了解决方法,但看起来不太好。有没有办法重构代码,以便 "add" 也接受其他参数并让我稍后访问它们?重要的事情:我不希望它们用“--”添加,我宁愿通过简单地在两个参数之间添加 space 来分隔它们。
我在 add_argument 中找到了“nargs='+' 选项,但我不知道如何重定向参数以调用正确的函数。
这是我到目前为止编写的代码:
import argparse
import sys
def init():
print("init method call")
def add():
if(len(sys.argv)>2):
print("valid add method call")
else:
print("invalid call")
def commit():
print("commit method call")
def status():
print("status method call")
def test():
print("test method call")
FUNCTION_MAP = {'init' : init,
'status' : status,
'commit': commit}
if __name__ == '__main__':
if(len(sys.argv)>1 and sys.argv[1] == "add"):
add()
else:
parser = argparse.ArgumentParser()
parser.add_argument('command', choices=FUNCTION_MAP.keys())
args = parser.parse_args()
func = FUNCTION_MAP[args.command]
func()
这里有 2 个选项 - 取一个额外的位置,然后使用或忽略这些值。或者使用子解析器。
import argparse
def add(args):
print("add:", args)
def status(args):
values = getattr(args,'values',None)
if values and len(values)>0:
# error message and method of your choice
print('oops - got values', args)
print("status method call")
FUNCTION_MAP = {'add' : add,
'status' : status}
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('command', choices=FUNCTION_MAP.keys())
parser.add_argument('values', nargs='*')
args = parser.parse_args()
func = FUNCTION_MAP[args.command]
func(args)
print('\nWIth subparsers')
parser = argparse.ArgumentParser()
sp = parser.add_subparsers(dest='command')
spp = sp.add_parser('add')
spp.add_argument('values', nargs='*')
spp = sp.add_parser('status')
args = parser.parse_args()
func = FUNCTION_MAP[args.command]
func(args)
样本运行
1906:~/mypy$ python3 stack49691897.py add 1 2 3
add: Namespace(command='add', values=['1', '2', '3'])
WIth subparsers
add: Namespace(command='add', values=['1', '2', '3'])
1907:~/mypy$ python3 stack49691897.py status
status method call
WIth subparsers
status method call
1907:~/mypy$ python3 stack49691897.py status 1 2 3
oops - got values Namespace(command='status', values=['1', '2', '3'])
status method call
WIth subparsers
usage: stack49691897.py [-h] {add,status} ...
stack49691897.py: error: unrecognized arguments: 1 2 3
argparse 文档还演示了一种使用子解析器和默认值的方法,可以有效地实现您的 FUNCTION_MAP
。