如何在python中使参数可选

  • 本文关键字:参数 python python argparse
  • 更新时间 :
  • 英文 :


我想让我的程序的这些调用工作,而不是其他的。

$ python3 myprog.py -i infile -o outfile
$ python3 myprog.py -o outfile
$ python3 myprog.py -o
$ python3 myprog.py 

我特别想让指定inffile而不指定outfile是非法的。

在第三种情况下,假定输出文件的默认名称为"out.json"。在第二、第三和第四种情况下,假定输入文件的默认名称为"file.n"。Json",其中n为整数版本号。在第四种情况下,输出文件将是"file.n+1"。其中n+1是比输入文件上的版本号大1的版本号。我的代码的相关部分是:

import argparse
parser = argparse.ArgumentParser(description="first python version")
parser.add_argument('-i', '--infile', nargs=1, type=argparse.FileType('r'), help='input file, in JSON format')
parser.add_argument('-o', '--outfile', nargs='?', type=argparse.FileType('w'), default='out.json', help='output file, in JSON format')
args = parser.parse_args()
print("Here's what we saw on the command line: ")
print("args.infile",args.infile)
print("args.outfile",args.outfile)
if args.infile and not args.outfile:
    parser.error("dont specify an infile without specifying an outfile")
elif not args.infile:
    print("fetching infile")
else: # neither was specified on the command line
    print("fetching both infile and outfile")

问题是当我运行

$ python3 myprog.py -i infile.json

而不是我希望的解析器错误,我得到:

Here's what we saw on the command line: 
args.infile [<_io.TextIOWrapper name='infile.json' mode='r' encoding='UTF-8'>]
args.outfile <_io.TextIOWrapper name='out.json' mode='w' encoding='UTF-8'>
fetching both infile and outfile

…这表明,即使命令行上没有"-o",它也会像有一样运行。

作为所选答案的附加项:

不指定文件而运行-o的选项,可以使用constnargs='?'组合来完成。

From the docs:

当add_argument()使用选项字符串调用时(如-f或——foo)和娜戈= ' ? '。这将创建一个可选参数,该参数可以遵循通过零或一个命令行参数。在解析命令行时,如果遇到没有命令行参数的选项字符串在它之后,将假定const的值。看到

示例(类型为string):

parser.add_argument('-o', '--outfile', nargs='?', const='arg_was_not_given', help='output file, in JSON format')
args = parser.parse_args()
if args.outfile is None:
    print('Option not given at all')
elif args.outfile == 'arg_was_not_given':
    print('Option given, but no command-line argument: "-o"')
elif:
    print('Option and command-line argument given: "-o <file>"')

您为输出文件指定了一个默认参数。

parser.add_argument('-o', '--outfile', nargs='?', type=argparse.FileType('w'), default='out.json', help='output file, in JSON format')

如果在命令行中没有指定-o选项,则参数解析器将插入默认参数。

修改为:

parser.add_argument('-o', '--outfile', nargs='?', type=argparse.FileType('w'), help='output file, in JSON format')

,事情应该如你所愿。


如果您希望能够指定-o,而不需要文件名,您可能想要这样做:

out_file = args.out if args.out is not None else 'json.out'

我不确定相关参数是否会是None''(即,空字符串),如果你指定-o没有参数-我怀疑它是None,但我不确定。你得测试一下才能确定。

如果没有argparse的额外逻辑,我不知道怎么做。

相关内容

  • 没有找到相关文章

最新更新