2017-10-14 10 views
2

숫자를 입력으로 사용하는 프로그램을 만들어 보겠습니다. 그럼에도 불구하고베이스를 지정할 수 있습니다. 지정하지 않으면 숫자가 10 진수입니다.Python - Argparse : 재정의 할 수있는 기본 도구

# 10 in decimal 
./get_num.py 10 

# 10 in octal 
./get_num.py -o 12 

# 10 in binary 
./get_num.py -b 1010 

파이썬 Argparse 모듈을 사용하고 싶습니다. 그러나이 결과를 얻는 방법을 찾을 수 없습니다. mutually exclusive group을 사용할 수있는 옵션이 있다는 것을 알고 있습니다. 그러나 이것은 항상 적합하지 않습니다. 그 이유는 항상 기본을 지정해야하기 때문입니다.

모델 코드 :

#!/usr/bin/env python3 

from argparse import ArgumentParser 


parser = ArgumentParser() 
parser.add_argument('base') 
parser.add_argument('-o') 
parser.add_argument('-b') 

args = parser.parse_args() 


if args.o: print('octal', args.o) 
if args.b: print('binary', args.b) 
else: print('decimal', args.base) 
+0

조건부에 자료를 넣으면 어떨까요? 'base :'를 만들고 기본 템플릿을 만듭니다. – Joe

+0

'base'는 위치 지정을하고'octal'과'binary'를 옵션으로 사용합니까? –

+0

기본 없음은 선택 사항 일 수 없습니다. 그러나 기준이 전달되었는지 확인하기위한 조건을 작성할 수 있습니다. 통과하지 못하면 기지를 시작하십시오. 코드를 게시하면 필요한 것을 추가 할 수 있는지 알 수 있습니다. – Joe

답변

1

나는 이것이 당신이 계신 않는 생각합니다. 상호 배타적 인 그룹에 기본을 지정할 필요가 없습니다. 기본적으로 required = false입니다.

import argparse 

parser = argparse.ArgumentParser(prog='PROG') 
group = parser.add_mutually_exclusive_group() 
group.add_argument('-b', action='store_true') 
group.add_argument('-o', action='store_true') 
parser.add_argument('num', help='number') 

args=parser.parse_args() 

base=10 # default base 
if args.b: 
    base=2 
elif args.o: 
    base=8 
# add other bases as required 

print(int(args.num, base=base)) 

출력; argparseadd_argumentdest, action='store_const'const 옵션을 사용하여

run get_num.py -b 1010 
10 

run get_num.py -o 12 
10 

run get_num.py 10 
10 

run get_num.py -b -o 12 
usage: PROG [-h] [-b | -o] num 
PROG: error: argument -o: not allowed with argument -b 
An exception has occurred, use %tb to see the full traceback. 

SystemExit: 2 
0

,이 작업을 수행 할 수 있습니다

import argparse 

parser = argparse.ArgumentParser() 
group = parser.add_mutually_exclusive_group() 
parser.add_argument('value', help='Value') 
group.set_defaults(base=10) 
group.add_argument('-b', dest='base', action='store_const', const=2, 
        help="Use base 2") 
group.add_argument('-o', dest='base', action='store_const', const=8, 
        help="Use base 8") 

args = parser.parse_args() 

print("Value {value}, base {base}".format(value=args.value, base=args.base)) 

을 다음과 같은 결과 :

$ python base.py 100 
Value 100, base 10 
$ python base.py 100 -b 
Value 100, base 2 
$ python base.py 100 -b2 
usage: base.py [-h] [-b | -o] value 
base.py: error: argument -b: ignored explicit argument '2' 
$ python base.py 100 -o 
Value 100, base 8 
$ python base.py 100 -o -b 
usage: base.py [-h] [-b | -o] value 
base.py: error: argument -b: not allowed with argument -o 

을 당신은 또한 할 수있다사용을 고려하십시오.옵션 대신 정수 값 (기본값 10)을 사용하십시오. 나에게 프로그램이 더 명확하고 단순 해집니다.

parser = argparse.ArgumentParser() 
parser.add_argument('value', help='Value') 
parser.add_argument('-B', '--base', type=int, default=10, 
        help="Base to use")