我试图在我的id
解析器中排除。基本上我想要的是避免argparse
选项和--all
参数被解析(我认为成功)。
但我想创建另一个检查,如果我只传递filenames
,python 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
。
有没有办法在不创建filenames
子命令的情况下让我的工作像我想要的那样,例如read
?
如何在python reader.py read all
中访问错误消息?我想要一些默认消息,说argparse
和filenames
无法合并而不是--all
错误。
此外,我想避免使用SystemExit
,因为这只是我的真正解析器的片段,这种方法不起作用(已在其他SO主题中检查过)。
我听说过自定义操作,但它确实有助于查看示例。
答案 0 :(得分:1)
如果filenames
获得nargs="*"
,则应该允许您单独使用--all
。 parsed.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
异常。