본문 바로가기
Python

[Python] Parameter 의 종류 - Slash and Asterisk for Function Parameters

by ds31x 2024. 2. 4.

Function의 헤더에서 parameters 를 정의하는데,

해당 parameters 중,

  • 어떤 것들이 positional parameters 로만 사용가능한지,
  • 어떤 것들이 일반적인 parameters로서 positional parameters 또는 keyword parameters 모두 사용가능한지,
  • 어떤 것들은 keyword parameters 로만 사용가능한지

를 명시적으로 선언하는데

사용되는 symbol이 바로 slash / 와 asterisk * 임.


Parameter의 종류

  1. 위치 전용 매개변수 - Positional-only Parameters
    • / 기호 이전에 선언된 매개변수
    • Python 3.8부터 도입됨
  2. 위치 또는 키워드 매개변수 - Positional-or-Keyword Parameters
    • /* 사이에 선언된 매개변수
    • 위치나 키워드로 전달 가능
  3. 키워드 전용 매개변수 - Keyword-only Parameters
    • * 또는 *args 이후에 선언된 매개변수
    • 키워드로만 전달 가능
    • Python 3.0부터 도입됨
  4. 기본값이 있는 매개변수 - Parameters with Default Values
    • 선택적(Optional) 매개변수라고도 함
    • 함수 호출 시 인자를 제공하지 않으면 기본값 사용
  5. 가변 위치 인자 - Variable Positional Arguments
    • *args로 표시 (이름은 관례에 따른 것)
    • 위치 인자 패킹(Positional Arguments Packing)이라고도 함
    • 추가 위치 인자를 튜플로 수집
  6. 가변 키워드 인자 - Variable Keyword Arguments
    • **kwargs로 표시 (이름은 관례에 따른 것)
    • 키워드 인자 패킹(Keyword Arguments Packing)이라고도 함
    • 추가 키워드 인자를 딕셔너리로 수집
  7. 매개변수 구분자 - 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