python - 有没有办法在 Argparse 中设置没有任何前缀的选项?

标签 python arguments argparse

我正在使用 Argparser 来处理我的 CLI 程序的参数。但随着时间的推移,我认为使用它并不是一个好主意。问题来了。我想使用没有任何前缀字符的选项。像 git commitsvn move。我搜索了一下,发现 Argparse 有一个 add_subparser() 方法。让我们填充我们的 foo 程序:

parser = argparse.ArgumentParser(prog='foo', usage='%(prog)s [options]')

subparsers = parser.add_subparsers(help='sub-command help')
parser_a = subparsers.add_parser('add', help='a help')
parser_a.add_argument('-ap', '--add-project',
                    nargs='*',
                    action='store',
                    help="Add project")

parser_d = subparsers.add_parser('del', help='a help')
parser_d.add_argument('-dp', '--delete-project',
                    nargs='*',
                    action='store',
                    help="Delete project")

args = parser.parser_args()

现在让我们使用选项执行 foo 并打印 args 命名空间(我没有过去的整个代码,你明白了):

$ ./foo del
Namespace(delete_project=None)
$ ./foo add
Namespace(add_project=None)

如您所见,如果我执行选项 deladd_project 不会传递给变量 args。如果我的 main() 函数中有一个“if 子句”,这会导致问题,例如

def main(args):

   if args.delete_project:
      ...
   if args.add_project:
      ...

如果我执行 ./foo del,我将得到一个 AttributeError 异常,即命名空间没有名称为 add_project 的属性。除此之外,我无法将任何参数传递给选项 deladd。我还将 prefix_chars 设置为一个空字符串,这也不起作用。

有什么办法处理吗? argparse 是否能够创建像 git、svn 等选项。还是我应该创建自己的函数并自己处理所有参数?

最佳答案

代替您的 if 语句,the argparse docs recommend something like this :

parser_X.set_defaults(action=action_func)
args.action(args)

然后 add_action 将查看 add_project,del_action 将查看 del_project。

关于python - 有没有办法在 Argparse 中设置没有任何前缀的选项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4370834/

相关文章:

python - Django 按计算字段对记录进行排序

python - 如何区分 __getattr__ 中的 hasattr 和普通属性访问?

python - 函数 cx_Oracle.connect(usr,pwd,host :port/service)? 是否有任何超时

python - 提取函数中命令行参数的名称

python argparse 数组而不是 str

python - 从数组中形成成对的非连续元素

c - "Address 0x7f out of bounds"通过函数传递参数

具有多个隐式参数的函数文字

c# - 括号中带有(属性)的方法参数

Python 参数解析 : nargs ='?' and optional arguments