遇到第一个未知参数时停止解析

7 投票
2 回答
991 浏览
提问于 2025-04-16 21:28

使用 argparse 这个库,能不能在遇到第一个不认识的参数时就停止解析其他参数呢?

我找到两个差不多的解决办法:

  1. parse_known_args,这个方法可以识别已知的参数,但在遇到第一个不认识的参数后,仍然会继续检测后面的已知参数。
  2. nargs=argparse.REMAINDER,这个方法会在遇到第一个非选项参数时停止解析,但如果之前有不认识的选项参数,就会报错。

我是不是漏掉了什么?我真的需要用 argparse 吗?

2 个回答

1

有一种方法可以做到这一点,虽然在所有情况下可能不是最完美的,就是使用 getopt

比如说:

import sys
import os
from getopt import getopt


flags, args = getopt(sys.argv[1:], 'hk', ['help', 'key='])

for flag, v in flags:
    if flag in ['-h', '--help']:
        print(USAGE, file=sys.stderr)
        os.exit()
    elif flag in ['-k', '--key']:
        key = v

一旦 getopt 遇到一个不是选项的参数,它就会停止处理后面的参数。

2

我自己没有用过 argparse(因为我需要让我的代码兼容2.6版本),不过我看了一下文档,感觉你没有漏掉什么。

所以我想知道你为什么想让 argparse 停止解析参数,以及为什么 -- 这个伪参数不能解决你的问题。根据文档:

如果你有一些位置参数,它们必须以 '-' 开头,但看起来又不像负数,你可以插入伪参数 '--',这会告诉 parse_args() 后面的内容都是位置参数:

>>> parser.parse_args(['--', '-f'])
Namespace(foo='-f', one=None)

撰写回答