IT & Programming/python

파이썬 가변매개변수

오스카리 2025. 5. 17. 21:50

파이썬에서 가변 매개변수(variable-length arguments) 는 함수가 호출될 때 인자의 개수를 유연하게 받을 수 있도록 하는 문법입니다.
이는 함수 호출 시 인자의 개수나 형식이 정해져 있지 않을 때 매우 유용하게 사용됩니다.


1. 종류

문법 설명 타입

*args 위치 인자를 여러 개 받음 tuple
**kwargs 키워드 인자를 여러 개 받음 dict

2. *args: 가변 위치 인자

2.1 정의

  • 함수에 전달된 위치 기반 인자들을 튜플(tuple) 형태로 전달받음
  • 이름은 관례적으로 args를 쓰지만 변경 가능

2.2 예제

def add(*args):
    print("입력된 값:", args)
    return sum(args)

print(add(1, 2))          # 3
print(add(1, 2, 3, 4, 5)) # 15

출력

입력된 값: (1, 2)
입력된 값: (1, 2, 3, 4, 5)

설명

  • *args는 튜플 (1, 2), (1, 2, 3, 4, 5) 형태로 전달됨

3. **kwargs: 가변 키워드 인자

3.1 정의

  • 키워드 기반 인자들을 딕셔너리(dict) 형태로 전달받음

3.2 예제

def show_info(**kwargs):
    for key, value in kwargs.items():
        print(f"{key}: {value}")

show_info(name="홍길동", age=30, city="Seoul")

출력

name: 홍길동
age: 30
city: Seoul

설명

  • **kwargs는 내부적으로 {"name": "홍길동", "age": 30, ...} 형태의 딕셔너리로 전달됨

4. *args + **kwargs 동시 사용

예제

def log_event(event_type, *args, **kwargs):
    print(f"[{event_type}] 이벤트 발생")
    print("추가 인자:", args)
    print("메타 정보:", kwargs)

log_event("로그인", "user123", "성공", ip="127.0.0.1", browser="Chrome")

출력

[로그인] 이벤트 발생
추가 인자: ('user123', '성공')
메타 정보: {'ip': '127.0.0.1', 'browser': 'Chrome'}

설명

  • *args는 ('user123', '성공')
  • **kwargs는 {'ip': '127.0.0.1', 'browser': 'Chrome'}

5. 주의사항: 매개변수 순서

함수 정의 시 매개변수는 아래 순서로 정의해야 합니다:

def 함수명(위치 인자, 기본값 인자, *args, 키워드 전용 인자, **kwargs)

예시

def sample(a, b=0, *args, c=1, **kwargs):
    ...

6. 실전 예제: API 요청 처리 함수

def api_request(endpoint, method="GET", *args, **params):
    print(f"API 요청: {method} {endpoint}")
    print(f"추가 인자: {args}")
    print("파라미터:")
    for k, v in params.items():
        print(f" - {k}={v}")

api_request("/users", "POST", "admin", "active", page=1, limit=20)

요약 정리

문법 설명 자료형

*args 위치 인자를 여러 개 받음 tuple
**kwargs 키워드 인자를 여러 개 받음 dict
동시 사용 가능 (순서 주의) 조합 사용

 

 

 


1. 클래스 설계에서의 *args, **kwargs 활용

1.1 목적

  • 다양한 속성을 가진 객체를 유연하게 생성할 수 있게 설계
  • 필수 속성은 일반 매개변수로, 옵션은 **kwargs로 처리

예제: 사용자(User) 클래스를 가변 매개변수로 설계

class User:
    def __init__(self, username, email, *tags, **info):
        self.username = username
        self.email = email
        self.tags = tags                # 튜플
        self.extra_info = info         # 딕셔너리

    def display(self):
        print(f"사용자: {self.username} ({self.email})")
        if self.tags:
            print("태그:", ', '.join(self.tags))
        if self.extra_info:
            print("추가 정보:")
            for key, value in self.extra_info.items():
                print(f" - {key}: {value}")

사용 예

u1 = User("hong", "hong@test.com", "admin", "active", age=30, city="Seoul")
u1.display()

출력

사용자: hong (hong@test.com)
태그: admin, active
추가 정보:
 - age: 30
 - city: Seoul

설명

  • username, email: 필수 인자
  • *tags: 위치 태그형 옵션 (ex: 역할, 상태)
  • **info: 추가 정보 (키-값 쌍)

2. Flask 라우팅 함수에서의 **kwargs 활용

2.1 목적

  • 요청 파라미터를 유동적으로 받아 처리할 수 있게 구성
  • 동일 라우터에서 다양한 키워드 파라미터 처리 가능

환경 준비

pip install flask

2.2 예제: 동적 파라미터를 처리하는 Flask 라우터

from flask import Flask, request, jsonify

app = Flask(__name__)

@app.route('/search', methods=['GET'])
def search():
    # 쿼리스트링에서 전달된 모든 파라미터를 dict로 가져옴
    params = request.args.to_dict()
    
    return jsonify({
        "message": "검색 요청 수신",
        "받은 파라미터": params
    })

호출 예

http://localhost:5000/search?query=아이폰&limit=10&page=2

응답 예

{
  "message": "검색 요청 수신",
  "받은 파라미터": {
    "query": "아이폰",
    "limit": "10",
    "page": "2"
  }
}

2.3 Flask에서 **kwargs로 라우팅 함수 설계

URL 패턴 내 변수 전달 예제

@app.route('/user/<username>')
def get_user(username):
    return f"{username}님의 프로필 페이지입니다."

다중 변수 및 **kwargs 활용

@app.route('/product/<category>/<int:pid>')
def product_detail(category, pid):
    return f"카테고리: {category}, 상품 ID: {pid}"

Flask는 내부적으로 URL 변수를 **kwargs 형태로 처리합니다.
→ view_func(**kwargs) 형태로 전달되기 때문에, 동적 URL 매핑에 매우 적합합니다.


3. 요약 정리

적용 분야 가변 매개변수 활용 목적

클래스 설계 *args, **kwargs 유연한 속성 전달 및 구조화
Flask 라우팅 request.args, <변수> → **kwargs 요청 인자 자동 수신, URL 변수 매핑

다음 확장 가능 항목

  • **kwargs 기반의 Flask form validation 시스템 설계
  • Flask의 request.form, request.json → 내부 DTO 클래스로 자동 매핑
  • FastAPI로 전환 시 Pydantic과의 조합 예시

 

반응형