【问题标题】:How to add optional arguments with default values in Python using argparse?如何使用 argparse 在 Python 中添加具有默认值的可选参数?
【发布时间】:2017-12-02 08:27:54
【问题描述】:

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

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 及其默认值。如何纠正?

【问题讨论】:

  • 没有破折号 TEXTFILE 是位置。带有破折号的--WORDSFILE 除了文件名之外还需要标志字符串(否则使用默认值)。

标签: python-3.x argparse


【解决方案1】:

对文本使用-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'>)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-24
    • 1970-01-01
    • 2010-09-23
    • 2013-04-25
    • 2015-05-12
    • 2013-03-23
    • 2018-03-26
    • 1970-01-01
    相关资源
    最近更新 更多