[Python] parameter & argument 몇가지 특징 기록

2025. 5. 1. 02:24Developers 공간 [Shorts]/Software Basic

728x90
반응형
<분류>
A. 수단
- OS/Platform/Tool : Linux, Kubernetes(k8s), Docker, AWS
- Package Manager : node.js, yarn, brew, 
- Compiler/Transpillar : React, Nvcc, gcc/g++, Babel, Flutter

- Module Bundler  : React, Webpack, Parcel

B. 언어
- C/C++, python, Javacsript, Typescript, Go-Lang, CUDA, Dart, HTML/CSS

C. 라이브러리 및 프레임워크 및 SDK
- OpenCV, OpenCL, FastAPI, PyTorch, Tensorflow, Nsight

 


1. What? (현상)

먼저 매개변수와 인자의 차이는 아래와 같습니다.

  • 매개변수(parameter) : 함수에 전달된 데이터를 사용하기 위한 입력 변수 명으로, 아래의 str1 str2입니다.
def concat(str1, str2):
  return a + " "+ b
  • 인자(argument) : 함수에 전달되는 데이터인 입력 값으로, 아래의 "parameter"와 "argument"입니다.
concat("parameter", "argument")

 

 

이렇게 전달되는 argument-parameter는 네가지로 나뉩니다.

  • 위치 인자(Positional Argument): 인자와 매개변수에 위치를 일치시킴으로써 제공
  • 키워드 인자(Keyword Argument)(Named Parameter) : 매개변수에 이름으로 일치시키는 인자
  • 가변 인자(Variable-length Positional Argument) : 여러 개의 "위치 인자"를 받을 때 사용, 주로 *args 사용해 제공되면, 튜플로 형태로 받음
  • 키워드 가변 인자(Keyword Variable-length Positional Argument) : 여러 개의 "키워드 인자"를 받을 때 사용, **kwrags를 사용해 제공되면 딕셔너리로 받음

 

이들을 활용하는데 있어서 아래와 같은 몇가지 규칙도 존재합니다.

  • Default값이 없는 Parameter는 반드시 인자 제공되어야합니다.
  • 모든 Parameter는 위치인자나 키워드인자로 제공이 가능합니다.
    • 단, Positional-only Parameter ( / 앞에 오는 인자) : 반드시 위치인자로 제공되어야합니다.
    • Keyword-only Parameter ( * 뒤에 오는 인자) : 반드시 키워드인자로 제공되어야합니다.
  • Parameter를 설정할 때, 순서와 관련된 기본 규칙이 있습니다.
    • 위치인자는 앞쪽에, 키워드인자는 뒤쪽에
    • 일반 인자는 앞쪽에, 가변인자는 뒤쪽에
    • default 값이 없는 Parameter는 앞쪽에, default 값이 있는 Parameter는 뒤쪽에

[Parameter들의 순서]

 

이중에 *args**kwargs를 포함한 parameter와 argument에 대한 몇가지 사용 예시를 남기고자 합니다.


2. Why? (원인)

  • X

3. How? (해결책)

 

1. kwargs로 받더라도, 다음 내부 클래스에 넘기거나 안넘기거나

 

  • 중간에 파라미터 제거후 나머지 kwargs를 넘기기 : 아래의 경우 args1args2는 kwargs로 제공되었지만, 중간에 argument로 설정되면서 kwargs로 넘어가지 않게 됩니다.
  • 중간의 파라미터 그대로 넘기지만 활용하기 : 아래의 경우 args3는 그대로 넘어가지만 딕셔너리처럼 활용되어 중간에서도 활용될 수 있습니다.
    ** 아래와 같이 kwargs["args3"]나 kwargs.get('args3', False) 형태로 얻으면 문제 없지만 kwargs.pop('args3', False) 형태 는 안됩니다.
class ClassLevel1:
    def __init__(
        self,
        **kwargs
    ):
        self.assign = ClassLevel2(**kwargs)
                
class ClassLevel2:
    def __init__(
        self,
        args1: int,
        args2: bool = False,
        **kwargs,
    ):
        self.assign=kwargs["args3"]
        self.assign2 = ClassLevel3(**kwargs)
        
class ClassLevel3:
    def __init__(
        self,
        args3: int=1,
        args4: bool=True,
        **kwargs,
    ):
        pass

 

 

2. args의 일부만 사용하기

 

*args는 튜플이므로 아래와 같이 일부를 사용할 수 있습니다.

def Function(*args):
	print(args[1:3])
    
Function("test0", "test1", "test2", "test3", "test4")
('test1', 'test2', 'test3')

 

**kwargs와 섞여있을때도 마찬가지입니다.

def Function2(*args, **kwargs):
	print(args[1:3])
    
Function("test0", "test1", "test2", "test3", "test4")
('test1', 'test2', 'test3')

 

 

3. typing을 활용해 파라미터 타입 명시하기

 

아래와 같이 input을 명시할 수 있으며, 조금 헷갈릴 수 있는 타입들은 아래와 같습니다.

  • tp.Optional[X] : Union[X, None]과 같이 None이 가능한 타입
  • tp.Any : 모든 가능한 타입
  • tp.Callable[INPUT, OUTPUT] : INPUT 타입을 받아 OUTPUT타입을 return하는 함수 타입
  • tp.Union[X,Y] : X와 Y 둘다 될 수 있는 타입
  • tp.Tuple : immutable sequences 타입
import typing as tp

class MY_CLASS:
    def __init__(self):
        args1: tp.Literal["Type1", "Type2"] = "Type1",
        args2 :tp.List[float]=[1.0,1.0], 
        args3: tp.Dict[str, tp.Any],
        args4: tp.Optional[int] = None,
        args5: tp.Optional[torch.Tensor] = None,
        args6: tp.Optional[tp.Dict[str, tp.Any]] = None, 
        args7: tp.Optional[tp.Callable[[int, int], None]] = None,
        args8: tp.Union[torch.Tensor, tp.List[torch.Tensor], tp.Tuple[torch.Tensor]],
        args9: tp.Union[torch.device, str], 
        **kwargs)-> tp.Tuple[torch.Tensor, torch.Tensor] :
        	pass

 

위와 같이 ->를 통해 return 타입도 명시할 수 있습니다.


https://velog.io/@inah-_-/Python-Positional-Arguments-와-Keyword-Arguments

https://brunch.co.kr/@princox/180

 

728x90
반응형