所以三个示例电话是:
python reader.py some.txt
python reader.py new another.txt
python reader.py edit some.txt
处理这些最简单的方法是用一个“可选”位置,以及一个要求之一。
parser = ArgumentParser...
parser.add_argument('-v','--verbose', ...)
parser.add_argument('cmd', nargs='?', default='open', choices=['open','edit','new'])
parser.add_argument('filename')
为您3个样本,它应该产生这样的:
namespace(cmd='open', filename='some.txt')
namespace(cmd='new', filename='another.txt')
namespace(cmd='edit', filename='some.txt')
cmd
是一个可选的位置参数。如果缺失,则将一个字符串分配给filename
,并且cmd
得到其default
。比尝试使subparsers
可选更容易。
至于当前的解析器:
parent_parser = argparse.ArgumentParser(description="Read text files.")
parent_parser.add_argument('filename', help='TXT file', type=file, nargs='+')
我不建议使用type=file
。最好使用FileType
或默认字符串(可让您稍后在with context
中打开文件)。
至于nargs='+'
,你真的想分配1 or more
字符串到filename
?或者你是在想'?',那会是0 or 1
,也就是说它是可选的?
parent_parser.add_argument('--verbose', '-v', action='store_true',
help="Verbosity on")
child_parser = parent_parser.add_subparsers(title="subcommand",
help="Subcommand help")
new_file_command = child_parser.add_parser('new', help="New text file")
edit_file_command = child_parser.add_parser('edit', help="Edit existing text file")
混合此filename
位置,其接受可变数量的值,与subparsers参数(即期望要么new
或edit
的位置)可能是一个问题。
我希望反对subparser命令丢失。 'python reader.py new another.txt'
会尝试将new
分配给filename
和another.txt
以分包器,并引发错误。
倒不如在所有3个案件期望subparsers命令:
parent_parser = argparse.ArgumentParser(description="Read text files.")
parent_parser.add_argument('--verbose', '-v', action='store_true',
help="Verbosity on")
child_parser = parent_parser.add_subparsers(title="subcommand",
help="Subcommand help", dest='cmd')
open_file_command = child_parser.add_parser('open', help="Open text file")
open_file_command.add_argument('filename', help='TXT file')
new_file_command = child_parser.add_parser('new', help="New text file")
new_file_command.add_argument('filename', help='TXT file')
edit_file_command = child_parser.add_parser('edit', help="Edit existing text file")
edit_file_command.add_argument('filename', help='TXT file')
每一个命令,“开放”,“新”,“编辑”,需要一个“文件名”。
试图避免使用open
命令将产生比它的价值更多的困难。
(存在这样使得subparsers可选最新argparse一个bug /功能,但你不应该利用这一点没有真正知道的问题。)
有了:
parser = argparse.ArgumentParser()
parser.add_argument('-v', '--verbose')
parser.add_argument('cmd', nargs='?', default='open',
choices=['open', 'edit', 'new'])
parser.add_argument('filename', nargs='+')
我希望reader.py new customstring
给
namespace(cmd='new', filename=[customstring])
它可以用作:
if args.cmd=='new':
with open(args.filename[0] + '.txt', 'w') as f:
# do something with the newly created file
open
和edit
会使用不同的open
模式。
嗨,感谢您的帮助。我还有最后一个问题。我仍然想知道如何定制位置参数。假设我有以下代码: parser = argparse.ArgumentParser() parser.add_argument(' - v','--verbose') parser.add_argument('cmd',nargs ='?',default ='open ',options = ['open','edit','new']) parser.add_argument('filename',nargs ='+') 如果我想自定义命令'new'的位置参数?我不需要/希望传递明确的文件名,而只需要一个像'some'这样的字符串,然后创建文件'some.txt'。我该怎么做呢?谢谢 – user3056783
你可以创建一个自定义的'type'或'Action'。但通常在解析后进行这种更改会更简单。特别是如果你没有对“某些”进行错误检查。 – hpaulj
嗨我还在阅读文档,并试图找出这一点,但我无法在网上找到更多的例子。你能告诉我一个片段,你将如何实现这个解析后?因为如果我执行'reader.py new customstring',它会对现有文件名进行错误检查,所以它不会让我做任何事情。 – user3056783