목차
Python 함수 파라미터 순서 완벽 가이드: self, *args, **kwargs 이해하기
안녕하세요. 파파대니입니다.
이 글을 쓰게 된 이유는 Python에서 함수 파라미터의 순서를 이해하는 것이 매우 중요하기 때문입니다.
함수나 메서드를 정의할 때 파라미터의 순서를 잘못 지정하면 문법 오류가 발생하거나 예상치 못한 결과를 초래할 수 있습니다.
또한, Python에서는 다양한 유형의 파라미터를 사용할 수 있는데, 각 파라미터의 특성과 올바른 사용법을 이해하는 것이 코드를 작성하는 데 큰 도움이 됩니다.
함수 파라미터의 순서
Python에서 함수나 메서드를 정의할 때, 파라미터는 반드시 정해진 순서대로 배치해야 합니다.
올바르지 않은 순서로 파라미터를 정의하면 SyntaxError가 발생할 수 있습니다.
함수 파라미터의 올바른 순서는 다음과 같습니다:
- self: 클래스 메서드에서 첫 번째로 위치해야 하는 인자입니다. 이 인자는 인스턴스 자신을 참조합니다. self는 메서드 정의에서 필수로 사용되며, 클래스 인스턴스에서 메서드를 호출할 때 자동으로 전달됩니다.
- 위치 인자 (Position argument): 주로 우리가 사용하는 기본 파라미터로, 순서대로 값을 입력받습니다.
- 기본값 인자 (Default value argument): 기본값이 있는 인자로, 함수 호출 시 인자가 입력되지 않으면 기본값을 사용합니다.
- 가변 인자 (*args): 개수가 정해지지 않은 여러 인자를 받을 때 사용하며, 튜플 형태로 받습니다.
- 키워드 전용 인자 (Keyword-only argument): 함수 호출 시 파라미터 이름을 명시적으로 지정해야 하는 인자입니다.
- **가변 키워드 인수 (kwargs): 이름과 값을 모두 받을 수 있는 인자로, 딕셔너리 형태로 받습니다.
이 순서를 지키지 않으면 문법 오류나 예상치 못한 결과가 발생할 수 있습니다. 각 인자의 순서 문제와 예시를 통해 살펴보겠습니다.
1. self: 인스턴스 자신을 참조
self는 Python에서 클래스 내 메서드를 정의할 때 항상 첫 번째 인자로 사용됩니다.
self는 인스턴스 자신을 참조하는 역할을 하며, 인스턴스 변수나 메서드에 접근할 때 필요합니다.
사실 self는 Python의 예약어가 아니며, 개발자가 임의로 이름을 변경할 수 있지만, 일반적으로 self라는 이름을 사용하는 것이 관례입니다.
예시:
class Car:
def __init__(self, brand, model):
self.brand = brand # 인스턴스 변수
self.model = model
def display_info(self):
print(f"브랜드: {self.brand}, 모델: {self.model}")
# 인스턴스 생성
my_car = Car("현대", "소나타")
my_car.display_info() # 출력: 브랜드: 현대, 모델: 소나타
위 예시에서 __init__ 메서드와 display_info 메서드의 첫 번째 인자 self는 모두 인스턴스를 참조하는 데 사용됩니다.
2. 위치 인자 (Position argument)
위치 인자(Position argument)는 함수나 메서드에 전달되는 값들이 선언된 순서대로 대응되는 인자입니다.
함수 호출 시 각 값은 함수 정의에서 지정된 위치에 따라 할당됩니다.
위치 인자는 기본적으로 필수 인자입니다.
예시:
def greet(name, age):
print(f"안녕하세요, {name}님! 나이는 {age}입니다.")
greet("홍길동", 30)
# 출력: 안녕하세요, 홍길동님! 나이는 30입니다.
위치 인자는 순서대로 값을 전달해야 하며, 이를 지키지 않으면 TypeError가 발생할 수 있습니다.
3. 기본값 인자 (Default value argument)
기본값 인자는 함수나 메서드를 호출할 때 값을 전달하지 않으면 자동으로 사용되는 기본값을 지정할 수 있는 인자입니다.
기본값 인자는 함수 정의에서 = 기호를 사용하여 값을 설정합니다.
기본값 인자는 위치 인자 뒤에 와야 하며, 기본값이 없는 인자보다 뒤에 위치해야 합니다.
예시:
def greet(name, age=20):
print(f"안녕하세요, {name}님! 나이는 {age}입니다.")
greet("홍길동")
# 출력: 안녕하세요, 홍길동님! 나이는 20입니다.
greet("김철수", 25)
# 출력: 안녕하세요, 김철수님! 나이는 25입니다.
위 예시에서 age는 기본값을 가지고 있기 때문에, 값을 전달하지 않으면 기본값인 20이 사용됩니다.
4. 키워드 전용 인자 (Keyword-only argument)
키워드 전용 인자(Keyword-only argument)는 함수나 메서드 호출 시, 해당 인자의 이름을 명시적으로 지정해야만 값을 전달할 수 있도록 하는 인자입니다.
이는 함수 정의에서 *를 사용하여 구분하며, * 뒤에 오는 인자는 모두 키워드 전용 인자로 간주됩니다.
예시:
def greet(name, *, age):
print(f"안녕하세요, {name}님! 나이는 {age}입니다.")
greet("홍길동", age=30)
# 출력: 안녕하세요, 홍길동님! 나이는 30입니다.
# greet("홍길동", 30) # 오류 발생: 'age'는 키워드 전용 인자이므로 값이 키워드로 지정되어야 합니다.
5. *args: 가변 인자 (튜플 형태)
*args는 함수나 메서드에서 인자의 개수가 정해져 있지 않은 경우에 사용됩니다.
*args를 사용하면 호출할 때 넘겨주는 인자의 개수에 관계없이 모두 튜플 형태로 받을 수 있습니다.
즉, 인자의 개수가 일정하지 않거나 여러 개의 값을 받을 때 유용합니다.
예시:
def add_numbers(*args):
return sum(args)
# 여러 개의 인자를 전달
result = add_numbers(1, 2, 3, 4)
print(result) # 출력: 10
# 인자가 하나인 경우
result = add_numbers(5)
print(result) # 출력: 5
6. **kwargs: 키워드 인자 (딕셔너리 형태)
**kwargs는 키워드 인자를 받을 때 사용됩니다.
함수나 메서드에 넘겨지는 인자들을 키-값 쌍의 형태로 딕셔너리로 받을 수 있게 해 줍니다.
**kwargs는 함수나 메서드를 호출할 때 명시적으로 이름을 지정해서 전달된 인자를 처리하는 데 유용합니다.
예시:
def print_info(**kwargs):
for key, value in kwargs.items():
print(f"{key}: {value}")
# 키워드 인자로 전달
print_info(name="John", age=25, city="서울")
# 출력:
# name: John
# age: 25
# city: 서울
self, *args, **kwargs를 함께 사용하기
클래스 내에서 self, *args, **kwargs를 함께 사용하는 경우도 많습니다.
특히 메서드에서 다양한 수의 인자를 받을 때 유용합니다.
이를 활용하면 클래스를 더욱 유연하게 만들 수 있습니다.
예시:
class Person:
def __init__(self, name, age, *args, **kwargs):
self.name = name
self.age = age
self.additional_info = args
self.extra_data = kwargs
def display_info(self):
print(f"이름: {self.name}, 나이: {self.age}")
print(f"추가 정보: {self.additional_info}")
print(f"추가 데이터: {self.extra_data}")
# 인스턴스 생성
person = Person("Alice", 30, "Engineer", "Loves coding", city="Seoul", hobby="Reading")
person.display_info()
# 출력:
# 이름: Alice, 나이: 30
# 추가 정보: ('Engineer', 'Loves coding')
# 추가 데이터: {'city': 'Seoul', 'hobby': 'Reading'}
아규먼트 순서에 따른 문제 예시
1) 가변 인자 순서에 대한 오류
*args는 항상 위치 인자 뒤에 와야 하며, 고정된 인자 뒤에 올 수 없습니다.
*args를 고정된 인자들 뒤에 두는 것은 문법 오류를 발생시킵니다.
잘못된 예시:
def greet(name, *args, age): # 오류 발생
print(f"Hello, {name}! Your age is {age}.")
print("Additional names:", args)
greet("John", "Jim", "Dim", 32)
올바른 예시:
def greet(name, age, *args): # 올바른 순서
print(f"Hello, {name}! Your age is {age}.")
print("Additional names:", args)
greet("John", 32, "Jim", "Dim")
2) *args와 **kwargs의 순서
*args는 **kwargs보다 앞에 와야 합니다.
**kwargs가 *args보다 앞에 위치하면 문법 오류가 발생합니다.
잘못된 예시:
def example(**kwargs, *args): # 오류 발생
print(kwargs)
print(args)
example(name="Alice", age=30)
올바른 예시:
def example(*args, **kwargs):
print(kwargs)
print(args)
example(name="Alice", age=30) # 출력: {'name': 'Alice', 'age': 30} , ()
Python에서 함수 파라미터의 순서를 정확히 지키는 것은 코드의 오류를 방지하고 의도한 대로 함수가 작동하도록 하는 데 매우 중요합니다.
self, 위치 인자, 기본값 인자, *args, **kwargs는 각기 다른 용도와 순서 규칙을 가지고 있으며, 이를 이해하고 올바르게 적용하는 것이 좋은 코딩 습관을 기르는 첫걸음입니다.
⬇️ 참고하면 좋은 글 ⬇️
파이썬 고급 문법 완벽 가이드: 데코레이터, 제너레이터, 메타프로그래밍 등
Python에서 self, this, me 차이 한 번에 정리하기
Python에서 한글 처리 시 인코딩 문제 해결하기 (UTF-8 vs ANSI)
'IT > Python' 카테고리의 다른 글
Python에서 한글 처리 시 인코딩 문제 해결하기 (UTF-8 vs ANSI) (0) | 2024.12.11 |
---|---|
Python에서 self, this, me 차이 한 번에 정리하기 (1) | 2024.12.11 |
파이썬 클래스 데코레이터 완벽 가이드: 모든 메서드에 한 번에 적용하는 방법 (0) | 2024.12.11 |
파이썬 고급 문법 완벽 가이드: 데코레이터, 제너레이터, 메타프로그래밍 등 (0) | 2024.12.11 |
파이썬은 인터프리터인가? 컴파일인가? 실행 과정 완벽 정리 (1) | 2024.11.29 |