【发布时间】: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