[Tip] if문 분기와 삼항연산자가 사용하기 싫을 때

2021. 3. 24. 16:12·[Language] - Python

개요


코드를 작성하다보면 복잡한 도메인 혹은 비즈니스 요구사항에 의해 고려해야할 케이스가 많아지기도 한다. 예를 들면, 팩토리 패턴의 경우, 다양한 케이스 별로 분기하여 대응되는 클래스의 인스턴스를 초기화하는 일종의 공장 역할을 하는 클래스를 분리한다. 하지만, 결국 필자가 생각하기에 if 문 혹은 switch ~ case와 같은 형태의 가독성을 해치는 보일러 플레이트는 여전히 남아있다.

다행히도 Python에서는 딕셔너리라는 객체가 존재하고, 메소드 자체를 마치 객체처럼 다룰 수 있는 스크립트의 성질이 있기 때문에 이를 응용하여 if 문 분기를 사용하지 않고도 비교적 깔끔한 코드를 작성할 수 있다.

 


 

 

사용 예시


MAP_COLOR = {True: QColor(247, 230, 0), False: Qt.transparent}

@pyqtSlot(bool)
def on_toggled_change_highlight(self, state):
    for rubber in self.rubbers:
        rubber.setColor(MAP_COLOR[state])
    self.iface.mapCanvas().refresh()

예를 들어, 위 PyQT 코드처럼 특정 이벤트 핸들러 메소드가 정의되어 있다고 가정하자. 동작하는 애플리케이션의 상태(state)에 따라 색깔을 다르게 표현해주는 로직이다. 물론 if 문을 통해 state가 True 일 경우와 False 일 경우를 분리하여 setColor를 다른 색깔로 호출해줄 수 있다. 하지만, Python에서 Key-Value 기반의 딕셔너리에 bool 타입의 키값을 대입하여 로직을 분기시킬 수 있다.

 

 

MAP_FUNC = {
	"inst": generate_inst,
    "vocal": generate_vocal,
    "modulation": generate_modulation,
    "sustain": generate_sustain,
}

def generate_midi(category: str, parameter: dict):
	return MAP_FUNC[category](parameter)

위 코드는 생성할 MIDI의 종류에 따라 수행할 함수(호출한 결과가 아닌 함수 포인터)를 MAP_FUNC에 매핑해두고, generate_midi 함수에 생성을 원하는 카테고리를 인자로 전달하면 그에 맞는 함수를 호출하는 로직이다. 아마 if 문을 사용했더라면 조건을 검사하기 위한 라인까지 포함하면 2배는 긴 코드가 작성되었을 것이다. 여기에 더하여 MAP_FUNC 같은 딕셔너리들을 별도의 maps.py 같은 모듈에 분리하면 사용자(로직을 구현하는 개발자)는 generate_midi 함수에 집중하지 않고 MAP_FUNC만 집중해도 비즈니스 로직의 흐름을 제어할 수 있도록 개방-폐쇄의 원칙을 준수할 수 있게 된다.

'[Language] - Python' 카테고리의 다른 글

제너레이터 (Generator)  (0) 2021.04.14
함수형 프로그래밍  (0) 2021.03.25
zip  (0) 2021.03.24
property 데코레이터  (8) 2021.02.02
덕 타이핑 (Duck Typing)  (2) 2020.12.29
'[Language] - Python' 카테고리의 다른 글
  • 제너레이터 (Generator)
  • 함수형 프로그래밍
  • zip
  • property 데코레이터
Bebsae
Bebsae
  • Bebsae
    뱁새zip
    Bebsae
  • 전체
    오늘
    어제
    • 분류 전체보기 (108)
      • [DevOps] - Kubernetes (5)
      • [DevOps] - AWS (1)
      • [AI] - Machine Learning (19)
      • [AI] - Neural Network (7)
      • [CS] - Network (2)
      • [CS] - Data Structure (3)
      • [CS] - Design Pattern (6)
      • [Language] - Python (15)
      • [Library] - Numpy (7)
        • Quick Start (5)
        • API (2)
      • [Framework] - Django (3)
      • [Framework] - QGIS (6)
      • [Framework] - PyQT (4)
      • [Mathematics] - Linear Alge.. (14)
      • [Mathematics] - Statistical (2)
      • [ETC] - Python (3)
      • [ETC] - C++ (1)
      • [ETC] - Linux (1)
      • 논문 (5)
      • 회고록 (3)
      • 생산성 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • 깃허브
  • 공지사항

  • 인기 글

  • 태그

    RNN
    DEEPLEARNING
    MachineLearning
    Linear
    numpy
    linearalgebra
    QGIS
    algebra
    디자인패턴
    교차검증
    decomposition
    선형대수
    머신러닝
    Machine
    파이썬
    Python
    신경망
    분해
    Learning
    Convolution
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Bebsae
[Tip] if문 분기와 삼항연산자가 사용하기 싫을 때
상단으로

티스토리툴바