我需要重写一个参数解析器。应用程序有两种模式:控制台和图形。我们只能选择一种模式。最近,控制台版本收到两个参数:带文本的文件名和带文字的文件名。它看起来如此:
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及其默认值的某处出现问题。如何纠正?
答案 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'>)