Function의 헤더에서 parameters 를 정의하는데,
해당 parameters 중,
- 어떤 것들이 positional parameters 로만 사용가능한지,
- 어떤 것들이 일반적인 parameters로서 positional parameters 또는 keyword parameters 모두 사용가능한지,
- 어떤 것들은 keyword parameters 로만 사용가능한지
를 명시적으로 선언하는데
사용되는 symbol이 바로 slash /
와 asterisk *
임.
Parameter의 종류
- 위치 전용 매개변수 - Positional-only Parameters
- / 기호 이전에 선언된 매개변수
- Python 3.8부터 도입됨
- 위치 또는 키워드 매개변수 - Positional-or-Keyword Parameters
- /와 * 사이에 선언된 매개변수
- 위치나 키워드로 전달 가능
- 키워드 전용 매개변수 - Keyword-only Parameters
- * 또는 *args 이후에 선언된 매개변수
- 키워드로만 전달 가능
- Python 3.0부터 도입됨
- 기본값이 있는 매개변수 - Parameters with Default Values
- 선택적(Optional) 매개변수라고도 함
- 함수 호출 시 인자를 제공하지 않으면 기본값 사용
- 가변 위치 인자 - Variable Positional Arguments
- *args로 표시 (이름은 관례에 따른 것)
- 위치 인자 패킹(Positional Arguments Packing)이라고도 함
- 추가 위치 인자를 튜플로 수집
- 가변 키워드 인자 - Variable Keyword Arguments
- **kwargs로 표시 (이름은 관례에 따른 것)
- 키워드 인자 패킹(Keyword Arguments Packing)이라고도 함
- 추가 키워드 인자를 딕셔너리로 수집
- 매개변수 구분자 - Parameter Separators
- / - 위치 전용 매개변수 구분자(Positional-only Parameters Separator)
- * - 키워드 전용 매개변수 구분자(Keyword-only Parameters Separator)
사용법
사용법은 다음과 같음.
def ds_func(
pos_only_arg0, pos_only_arg1, #only positional
/,
arg0, arg1, # positional and keyword
*, # *packed_arg, 도 가능
kw_only_arg0, # 이후로는 keyword only
**kw_only_arg1, # **kw_arg 로 packing이 마지막에 놓임.
):
pass
- slash
/
앞의 파라메터들은 positional-only-arguments 로서 keyword 로 할당시 error 발생. - slash
/
와 asterisk*
(또는 *args 로 패킹기능의 가변갯수의 인자)사이의 파라메터들은 - positional argument 또는 keyword argument 로 할당이 가능한 일반 파라메터들임.
- asterisk
*
뒤의 파라메터들은 keyword-only-arguments 로만 할당될 수 있음.
참고로 Python 3.8 부터 위의 파라메터들을 구분하는 기능이 사용가능함.
- 기본값을 가지는 positional parameters는 다른 positional parameters의 뒤에 놓여야한다.
- *args 와 같은 패킹이 이루어지는 가변 갯수 위치파라메터나 * 의 바로 앞에 놓여야 함.
Example Code
def complete_function(
# 1. 위치 전용 매개변수
pos_only_required1, pos_only_required2, /,
# 2. 위치 또는 키워드 매개변수 (기본값 없는 것이 먼저, 기본값 있는 것이 뒤에)
pos_or_kw_required, pos_or_kw_optional1="기본값1", pos_or_kw_optional2="기본값2",
# 3. 가변 위치 인자(Variable Positional Arguments)
*args,
# 4. 키워드 전용 매개변수 (기본값 있는 것과 없는 것의 순서는 상관없음)
kw_only_required1, kw_only_optional1=True, kw_only_required2, kw_only_optional2=False,
# 5. 가변 키워드 인자(Variable Keyword Arguments)
**kwargs
):
"""
파이썬 함수 매개변수의 모든 유형과 규칙을 보여주는 함수
매개변수:
pos_only_required1, pos_only_required2: 위치 전용 매개변수
pos_or_kw_required: 필수 위치/키워드 매개변수 (기본값 없음)
pos_or_kw_optional1, pos_or_kw_optional2: 선택적 위치/키워드 매개변수 (기본값 있음)
*args: 가변 위치 인자(Variable Positional Arguments) - 튜플로 저장됨
kw_only_required1, kw_only_required2: 필수 키워드 전용 매개변수 (기본값 없음)
kw_only_optional1, kw_only_optional2: 선택적 키워드 전용 매개변수 (기본값 있음)
**kwargs: 가변 키워드 인자(Variable Keyword Arguments) - 딕셔너리로 저장됨
"""
print("=== 위치 전용 매개변수(Positional-only Parameters) ===")
print(f"pos_only_required1: {pos_only_required1}")
print(f"pos_only_required2: {pos_only_required2}")
print("\n=== 위치 또는 키워드 매개변수(Positional-or-Keyword Parameters) ===")
print(f"pos_or_kw_required: {pos_or_kw_required}")
print(f"pos_or_kw_optional1 (기본값='기본값1'): {pos_or_kw_optional1}")
print(f"pos_or_kw_optional2 (기본값='기본값2'): {pos_or_kw_optional2}")
if args:
print("\n=== 가변 위치 인자(Variable Positional Arguments) ===")
print(f"args 자료형: {type(args).__name__}")
for i, arg in enumerate(args):
print(f" args[{i}]: {arg}")
print("\n=== 키워드 전용 매개변수(Keyword-only Parameters) ===")
print(f"kw_only_required1: {kw_only_required1}")
print(f"kw_only_optional1 (기본값=True): {kw_only_optional1}")
print(f"kw_only_required2: {kw_only_required2}")
print(f"kw_only_optional2 (기본값=False): {kw_only_optional2}")
if kwargs:
print("\n=== 가변 키워드 인자(Variable Keyword Arguments) ===")
print(f"kwargs 자료형: {type(kwargs).__name__}")
for key, value in kwargs.items():
print(f" {key}: {value}")
# 호출 예시
print("=== 호출 예시 1: 최소 필수 인자만 전달 ===")
complete_function(
1, 2, # 위치 전용 매개변수
"필수 위치/키워드", # 필수 위치/키워드 매개변수
kw_only_required1="필수1", # 필수 키워드 전용 매개변수
kw_only_required2="필수2" # 필수 키워드 전용 매개변수
)
print("\n")
print("=== 호출 예시 2: 모든 매개변수 유형 사용 ===")
complete_function(
1, 2, # 위치 전용 매개변수
"필수 위치/키워드", # 필수 위치/키워드 매개변수 (위치로 전달)
"커스텀1", "커스텀2", # 선택적 위치/키워드 매개변수 (위치로 전달)
"추가1", "추가2", "추가3", # 가변 위치 인자 (*args로 수집)
kw_only_required1="필수1", # 필수 키워드 전용 매개변수
kw_only_optional1=False, # 선택적 키워드 전용 매개변수 (기본값 오버라이드)
kw_only_required2="필수2", # 필수 키워드 전용 매개변수
kw_only_optional2=True, # 선택적 키워드 전용 매개변수 (기본값 오버라이드)
extra1="값1", extra2="값2" # 가변 키워드 인자 (**kwargs로 수집)
)
print("\n")
print("=== 호출 예시 3: 키워드 인자 순서 변경 ===")
complete_function(
1, 2, # 위치 전용 매개변수
"필수 위치/키워드", # 필수 위치/키워드 매개변수
kw_only_required2="필수2", # 키워드 전용 매개변수 (순서 변경)
kw_only_required1="필수1", # 키워드 전용 매개변수 (순서 변경)
kw_only_optional2=True, # 선택적 키워드 전용 매개변수 (순서 변경)
extra2="값2", extra1="값1" # 가변 키워드 인자 (순서 변경)
)
더 읽어보면 좋은 URLs
2023.07.30 - [Python] - [Python] asterisk * 사용하기 : unpacking, packing
[Python] asterisk * 사용하기 : unpacking, packing
C언어에서 pointer 연산자인 * (asterisk)는 Python에서 상당히 낯설게 동작한다. (특히, PEP3132, PEP448 등에서 그 기능이 무지 많아져서... --;;) double asterisk ** 와 함께 packing과 unpacking 기능으로 정말 많이
ds31x.tistory.com
https://dsaint31.tistory.com/506
[Python] Function Definition, Call and Arguments
이 문서는 function에 대한 간단한 소개를 하고 있다. 일부 자세한 내용들은 관련 URL을 추가하는 형태로 확장될 수 있음. Function이란 재사용성과 가독성을 위해 논리적으로 코드를 나누는(or 그룹짓
dsaint31.tistory.com
'Python' 카테고리의 다른 글
[Python] importlib.util.find_spec() (0) | 2024.03.08 |
---|---|
[Programming] glue code and (language) binding (0) | 2024.03.04 |
[Python] mutable and immutable: Mutability (0) | 2024.02.03 |
[Python] Module, Package and Library (+ Framework) (0) | 2024.02.03 |
[Python] Arithmetics, Variables, Types and Assignment (1) | 2024.01.24 |