允许参数/选项覆盖位置参数

时间:2015-05-09 21:29:45

标签: python argparse

我试图在我的id解析器中排除。基本上我想要的是避免argparse选项和--all参数被解析(我认为成功)。

但我想创建另一个检查,如果我只传递filenamespython reader.py read --all参数将填充当前目录中的所有txt文件。

到目前为止,我已经提出了以下代码:

filenames

问题是,如果我尝试运行import argparse import glob parser = argparse.ArgumentParser() subcommands = parser.add_subparsers(title='subcommands') read_command = subcommands.add_parser('read') read_command.add_argument('filenames', type=argparse.FileType(), nargs = '+') read_command.add_argument('-a', '--all', action='store_true') parsed = parser.parse_args() if parsed.all and parsed.filenames: raise SystemExit if parsed.all: parsed.filenames = glob.glob('*.txt') print parsed ,由于python reader.py read --all参数,我得到错误error: too few arguments

  1. 有没有办法在不创建filenames子命令的情况下让我的工作像我想要的那样,例如read

  2. 如何在python reader.py read all中访问错误消息?我想要一些默认消息,说argparsefilenames无法合并而不是--all错误。

  3. 此外,我想避免使用SystemExit,因为这只是我的真正解析器的片段,这种方法不起作用(已在其他SO主题中检查过)。

    我听说过自定义操作,但它确实有助于查看示例。

1 个答案:

答案 0 :(得分:1)

如果filenames获得nargs="*",则应该允许您单独使用--allparsed.filenames将成为[],您可以将其替换为glob

您还可以测试一下default来自glob的{​​{1}},但请注意我对FileType的警告。

您是否希望解析器打开您提供的所有文件名?或者您宁愿自己打开文件(最好是在with上下文中)。 FileType打开文件(必要时创建),并在此过程中检查它们的存在(这很好),但由您(或程序退出)将其关闭以关闭它们。

文档讨论了自己发布错误消息以及如何更改错误消息。 parser.error('my message')显示用法和消息,然后退出。

if parsed.all and parsed.filenames:
    parsed.error("Do you want to read ALL or just %s?"%parsed.filenames)

SystemExit子句中也可能存在陷阱try/except异常。

相关问题