如何使用argparse在Python中添加带默认值的可选参数?

时间:2017-12-02 08:27:55

标签: python-3.x argparse

我需要重写一个参数解析器。应用程序有两种模式:控制台和图形。我们只能选择一种模式。最近,控制台版本收到两个参数:带文本的文件名和带文字的文件名。它看起来如此:

def parse_args():
parser = argparse.ArgumentParser(description='Fuzzy search in text')
parser.add_argument('-g', '--graphics', help='graphical version',
                    action='store_true')
parser.add_argument('-c', '--console', help='console version', nargs=2,
                    type=argparse.FileType('r'),
                    metavar=('TEXTFILE', 'WORDSFILE'))
return parser.parse_args()

usage: fuzzy_search.py [-h] [-g] [-c TEXTFILE WORDSFILE]

Fuzzy search in text

optional arguments:
  -h, --help            show this help message and exit
  -g, --graphics        graphical version
  -c TEXTFILE WORDSFILE, --console TEXTFILE WORDSFILE
                        console version

现在我需要在控制台版本中重写接受参数。我想添加两个可选参数,它们将为寄存器灵敏度(-r)和特殊视图(-v)存储true。我知道怎么做但我无法理解下一步该怎么做。我想做两个变体:1)强制性的两个文件,其中包含文本和单词,最初是2)必须的文件与文本,而不是必须的文件,如果它不是默认的 - sys.stdin。图形不应该接受任何参数。所以看起来应该是这样的

usage: fuzzy_search.py [-h] [-g] [-c [-r] [-v] TEXTFILE WORDSFILE(if not written then sys.stdin)]

我尝试了这个变种:

parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers(help='versions')

parser_console = subparsers.add_parser('console', help='console version')
parser_console.add_argument('-r', '--register-check', action='store_true', help='register sensitivity')
parser_console.add_argument('-v', '--row-view', action='store_true', help='row view')
parser_console.add_argument('TEXTFILE', type=argparse.FileType('r'), help='text file')
parser_console.add_argument('--WORDSFILE', type=argparse.FileType('r'), default=sys.stdin, help='words file')

parser_graphics = subparsers.add_parser('graphics', help='graphics version')

但是当我尝试这个时

print(parser.parse_args(['console', '-r', '-v', 'text.txt','words.txt']))

出现了错误:

unrecognized arguments: words.txt

用这个

print(parser.parse_args(['console', '-r', '-v', 'text.txt']))

一切都很好:

Namespace(TEXTFILE=<_io.TextIOWrapper name='text.txt' mode='r' encoding='cp1251'>, WORDSFILE=<_io.TextIOWrapper name='<stdin>' mode='r' encoding='UTF-8'>, register_check=True, row_view=True)

在可选参数WORDSFILE及其默认值的某处出现问题。如何纠正?

1 个答案:

答案 0 :(得分:0)

使用-t表示文字,-w表示单词文件。后者默认:

import argparse

parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers(help='versions')

parser_console = subparsers.add_parser('console',
                                       help='console version')
parser_console.add_argument('-r', '--register-check',
                            action='store_true', help='register sensitivity')
parser_console.add_argument('-v', '--row-view', 
                            action='store_true', help='row view')
parser_console.add_argument('-t', '--textfile', 
                            type=argparse.FileType('r'),
                            help='text file')
parser_console.add_argument('-w', '--wordsfile', type=argparse.FileType('r'),
                            default=sys.stdin, help='words file')


print(parser.parse_args(['console', '-r', '-v', '-t', 'text.txt',
                         '-w', 'words.txt']))

parser.parse_args(['console', '-r', '-v', '-t', 'text.txt'])

输出:

Namespace(register_check=True, row_view=True,
          textfile=<_io.TextIOWrapper name='text.txt' mode='r' encoding='UTF-8'>, 
           wordsfile=<_io.TextIOWrapper name='words.txt' mode='r' encoding='UTF-8'>)

Namespace(register_check=True, row_view=True, 
          textfile=<_io.TextIOWrapper name='text.txt' mode='r' encoding='UTF-8'>, 
          wordsfile=<_io.TextIOWrapper name='<stdin>' mode='r' encoding='UTF-8'>)