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과의 조합 예시
반응형