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