2017-12-02 2 views
0

인수 파서를 다시 작성해야합니다. 응용 프로그램에는 콘솔과 그래픽의 두 가지 모드가 있습니다. 하나의 모드 만 선택할 수 있습니다. 최근 콘솔 버전에는 텍스트가있는 파일 이름과 단어가있는 파일 이름의 두 가지 인수가 제공됩니다. 그것은 그렇게 보였다 :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)를 저장하는 두 개의 선택적 인수를 추가하려고합니다. 나는 그것을하는 방법을 안다. 그러나 나는 다음 일로 무엇을해야하는지 이해할 수 없다. 나는 2 가지 변종을 만들고 싶다 : 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

대시없이'TEXTFILE'가 위치합니다. '--WORDSFILE'에는 파일 이름 외에 플래그 문자열이 필요합니다 (그렇지 않으면 기본값이 사용됩니다). – hpaulj

답변

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'>) 
관련 문제