본문 바로가기
코딩취미/Python

partial 사용 방법과 이벤트 핸들러 적용 시 장점

by 브링블링 2024. 5. 30.
728x90

partial 사용방법과 이벤트 핸들러 적용 시 장점

functools.partial은 함수의 일부 인수를 고정하여 새로운 함수를 생성할 수 있습니다. 이를 통해 이벤트 핸들러를 구성할 때 코드 재사용 및 메소드 통합 등의 장점이 있습니다. functools 모듈은 파이썬 표준 라이브러리의 일부로, 함수형 프로그래밍을 지원하는 다양한 유틸리티 함수들을 제공합니다. 이 모듈을 통해 코드를 더 효율적이고 가독성 높게 작성할 수 있습니다.

partial 이벤트 핸들러 구성의 특징 및 사용 방법

이벤트 핸들러에서 partial을 사용하면 특정 인수를 미리 설정한 함수로 이벤트를 처리할 수 있습니다. 특히 콜백 함수나 이벤트 핸들러와 같은 상황에서 자주 사용됩니다. 이는 GUI 프로그래밍에서 유용하며, 다양한 라이브러리에서 활용됩니다. 예를 들어, tkinter, pygame 등에서 자주 사용됩니다. partial 함수를 사용하기 위해서는 functools 모듈에서 가져와야 합니다.

  1. 코드 재사용성:
    • 동일한 기본 기능을 가지는 여러 이벤트 핸들러를 생성할 수 있어 코드 재사용성이 높아집니다.
  2. 가독성 향상:
    • 함수 호출 시 반복되는 인수를 명시하지 않아도 되므로 코드가 간결하고 읽기 쉬워집니다.
  3. 유연성:
    • 다양한 상황에서 동일한 함수를 재사용할 수 있어 유연한 코드 구성이 가능합니다.
  4. 클래스 인스턴스 메소드와의 통합:
    • 클래스 내 메소드에서도 쉽게 사용할 수 있어 객체 지향 프로그래밍과 잘 맞습니다.

partial 구성

  • func: 새로운 부분 함수의 기반이 되는 원래 함수.
  • args: 고정할 위치 인수들.
  • keywords: 고정할 키워드 인수들.
from functools import partial

partial(func, /, *args, **keywords)

 

partial  기본 사용방법 예제

1) 기본 사용

from functools import partial

def multiply(x, y):
    return x * y

# y를 2로 고정한 새로운 함수를 생성
double = partial(multiply, y=2)

print(double(5))  # 출력: 10

 

2) 위치 인수 고정

def power(base, exponent):
    return base ** exponent

# base를 2로 고정한 새로운 함수를 생성
square = partial(power, 2)

print(square(3))  # 출력: 8 (2 ** 3)

 

3) 키워드 위치 고정

def greeting(greet, name):
    return f"{greet}, {name}!"

# greet을 'Hello'로 고정한 새로운 함수를 생성
hello = partial(greeting, greet="Hello")

print(hello("Alice"))  # 출력: Hello, Alice!

 

4) 고정 함수 인용

from functools import partial

def add(x, y, z):
    return x + y + z

# x와 y를 고정한 새로운 함수 생성
add_five = partial(add, 2, 3)

print(add_five(4))  # 출력: 9 (2 + 3 + 4)
728x90

5) ( tkinter ) GUI 버튼 이벤트 핸들러 적용 : 복수개의 버튼 적용

import tkinter as tk
from functools import partial

def on_button_click(message):
    print(f"Button clicked! Message: {message}")

root = tk.Tk()
root.title("Multiple Buttons")

# 'Hello' 메시지를 가진 이벤트 핸들러 생성
button1 = tk.Button(root, text="Say Hello", command=partial(on_button_click, "Hello"))
button1.pack(pady=10)

# 'Goodbye' 메시지를 가진 이벤트 핸들러 생성
button2 = tk.Button(root, text="Say Goodbye", command=partial(on_button_click, "Goodbye"))
button2.pack(pady=10)

root.mainloop()

 

5) ( pygame) GUI 키 이벤트 핸들러 적용 : 복수개의 키 동작 적용

import pygame
from functools import partial

def on_key_press(key, message):
    print(f"Key {key} pressed! Message: {message}")

pygame.init()
screen = pygame.display.set_mode((400, 300))
pygame.display.set_caption("Multiple Keys Example")

# 이벤트 핸들러 설정
key_events = {
    pygame.K_a: partial(on_key_press, 'A', "Alpha"),
    pygame.K_b: partial(on_key_press, 'B', "Bravo"),
    pygame.K_c: partial(on_key_press, 'C', "Charlie")
}

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN:
            handler = key_events.get(event.key)
            if handler:
                handler()

pygame.quit()

 

6) EventHanlder Class 구성

  1. 클래스 정의:
    • EventHandler 클래스는 이름을 받아 초기화하고, handle_event 메소드로 이벤트를 처리합니다.
  2. 인스턴스 생성:
    • handler 인스턴스를 생성하여 "Button1"이라는 이름을 부여합니다.
  3. 부분 적용 함수 생성:
    • partial을 사용하여 click_handler와 hover_handler를 생성합니다. 이때 handle_event 메소드의 event_type 인수를 각각 "click"과 "hover"로 고정합니다.
  4. 이벤트 처리:
    • click_handler와 hover_handler를 호출하여 이벤트를 처리합니다.
from functools import partial

class EventHandler:
    def __init__(self, name):
        self.name = name

    def handle_event(self, event_type, event):
        print(f"Handling {event_type} for {self.name}: {event}")

# 인스턴스 생성
handler = EventHandler("Button1")

# partial을 사용하여 이벤트 핸들러 생성
click_handler = partial(handler.handle_event, "click")
hover_handler = partial(handler.handle_event, "hover")

# 이벤트 발생 시 핸들러 호출
click_handler(event="Click Event")
hover_handler(event="Hover Event")

 

 

728x90