본문 바로가기

Computer/Python

Argparse nargs, const, default 인자 사용법

반응형

파이썬 파일 실행 시 원하는 인자를 커맨드라인 상에서 전달하기 위해 argparse 패키지를 많이 사용할 겁니다. 실제로 파이썬에서 처음 접하게 되는 내장 라이브러리 중 하나입니다만 argument를 추가할 때 사용하는 함수의 (add_argument 함수) type, default 인자 이외의 생소한 인자를 만나게 되면 항상 사용법을 검색하게 되는데, 저 같은 경우는 nargs/const/default 인자입니다.

 

nargs 인자

nargs 인자는 Number of Arguments 의미를 가지며 말 그대로 해당 argument에 대해 몇 개의 value를 넣을 것인지를 정합니다. 구체적인 숫자를 넣어도 되고 쉘 스크립트에서 사용되는 wildcard 캐릭터도 사용법이 미리 정의되어 있습니다. CLI 상에 전달할 argument 이름을 "test"라고 한다면,

  • nargs="구체적인 숫자": 파이썬 실행 시 "test" argument에 대해 지정한 숫자만큼의 값을 전달해야 합니다.
  • nargs="?": "test" argument에 대해 하나의 값이 올 수도 있고 안 올 수도 있습니다. (Optional)
  • nargs="*": 유연한 숫자가 가능하고 리스트로 묶이게 됩니다.
  • nargs="+": "*"와 비슷하나 최소 하나의 값이 필요합니다. (마찬가지로 리스트로 리턴됩니다)

 

nargs="?" with const, default

nargs="?" 일 때, const, default 인자가 같이 사용되고 있는 경우가 많습니다. nargs="?" 이면 해당하는 "test" argument가 값을 받아도 되고 한 개만 받아도 되기 때문에 CLI에서 선언될 수도 있고 안 될 수도 있습니다. 파이썬 실행 시 "test" argument에 값이 전달되지 않는다면 default 값이, 입력만 된다면 const 값이, 값까지 같이 입력되면 입력한 값이 "test" argument에 반영됩니다.

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--test", nargs="?", const=0, default=1, type=int)
args = parser.parse_args()
print(args)

python main.py  
>> Namespace(test=1)
python main.py --test
>> Namespace(test=0)
python main.py --test 2
>> Namespace(test=2)
  • const 인자를 사용하기 위해서는 nargs 값은 무조건 "?" 이어야 합니다.

 

nargs=argparse.REMAINDER

마지막으로 nargs=argparse.REMAINDER 옵션도 있습니다. 이 옵션은 보통 선언할 마지막 argument에 사용되는데, CLI 상에서 값들이 각 argument에 할당되고 나머지 모든 값들을 리스트 형태로 받고 보통 "--" 구분자 없이 사용합니다. 

  • "--test" 대신 "test"로 add_argument 함수에 사용한다면 CLI에서 "--test"로 값을 전달할 시에 에러가 납니다.
  • 따라서 "--" 형태 없이 add_argument 함수를 선언하면 CLI에서 선언된 위치에 맞게 값을 자동으로 가져오게 되는데요,
  • 보통 가장 마지막 선언되는 argument에서 "--" 형태를 빼고 사용됩니다.
import argparse

parser = argparse.ArgumentParser()
parser.add_argument("test", default=10, type=int)
parser.add_argument("test_remainder", nargs=argparse.REMAINDER, type=int)
args = parser.parse_args()
print(args)

python main.py --test 0 1 2 3 4
>> usage: argparser_test.py [-h] test ...
>> argparser_test.py: error: unrecognized arguments: --test

import argparse

parser = argparse.ArgumentParser()
parser.add_argument("--test", default=10, type=int)
parser.add_argument("test_remainder", nargs=argparse.REMAINDER, type=int)
args = parser.parse_args()
print(args)

python main.py --test 0 1 2 3 4
>> Namespace(test=1, test_remainder=[2, 3, 4])

단, 다음과 같이 두 개의 argument가 복수의 값을 받을 수 있다면 모든 값들은 nargs="*"로 먼저 선언된 "test" argument로 할당되고 "test_remainder" argument에는 남은 값들이 없다고 설정되어 빈 리스트가 됩니다. 따라서 nargs 인자를 복수로 할당할 수 있는 argument를 여러 개 설정하게 되면 이러한 순서 및 형태를 주의 깊게 구현해야 합니다.

import argparse

parser = argparse.ArgumentParser()
parser.add_argument("--test", default=10, nargs="*", type=int)
parser.add_argument("test_remainder", nargs=argparse.REMAINDER, type=int)
args = parser.parse_args()
print(args)

python main.py --test 0 1 2 3 4
>> Namespace(test=[1, 2, 3, 4], test_remainder=[])
반응형