argparse
CLI를 통해 사용자 입력을 받아야 할 때 주로 활용한다.
argparse.Argumentparser()
- 사용자 입력이 필요한 경우에 활용하자.
- 인자를 단순히 저장하는 것에 그치지 않고, 추가적인 행동을 명시해주고 싶을 때 활용하자
argparse.Namespace()
- 사용자 입력이 필요하지 않은 경우에 활용하자.
argparse.py 구조
전체 코드에서 _AttributeHolder
는 Action, Namespace, ArgumentParser만 상속한다. 인자를 저장하는 것이 모듈 목적인 점을 고려하면, 결국 Action, Namespace, ArgumentParser가 핵심인 것을 알 수 있다. 추가로 코드를 보면 ArgumentParser는 _ActionsCotainer
까지 상속한 것을 알 수 있는데, 이를 통해 ArgumentParser는 Action 정보까지 저장할 수 있다는 것을 확인할 수 있다.
argparse.py
# _AttributeHolder를 상속한 Class는 3개만 존재
class _AttributeHolder(object):
class Action(_AttributeHolder):
class Namespace(_AttributeHolder):
class ArgumentParser(_AttributeHolder, _ActionsContainer):
parse_known_args
미리 정의된 인자뿐 아니라 추가로 인자를 입력받고 싶을 때 활용한다. parse_args와는 다르게 추가 인자를 입력 해도 오류가 발생하지 않는다.
parse_known_args은 미리 정의해둔 인자들은 namespace에, 새로 추가한 인자는 extras에 저장한다. parse_args는 parse_known_args로 extras를 전달 받은 뒤, 새롭게 추가된 인자가 있다면 에러를 발생 시킨다.
def parse_known_args(self, args=None, namespace=None):
# return the updated namespace and the extra arguments
return namespace, extras
def parse_args(self, args=None, namespace=None):
args, argv = self.parse_known_args(args, namespace) # extras가 있다면 error가 발생
if argv:
msg = _('unrecognized arguments: %s')
self.error(msg % ' '.join(argv))
return args # namespace에 저장
Namespace
입력받은 인자들이 실제 저장되는 객체다. 사용자의 입력이 굳이 필요하지 않은 경우엔 Namespace를 선언하고 바로 인자를 설정해도 된다. 주피터 노트북에서 argparse를 사용할 땐, Namespace에 인자를 바로 넣어주면 에러가 발생하지 않는다.
import argparse
# Namespace에 바로 값을 넣어줘도 된다!
args = argparse.Namespace(
seed=0,
no_gpus=True,
f_lambda=None
)