[Python] parameter & argument 몇가지 특징 기록
2025. 5. 1. 02:24ㆍDevelopers 공간 [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는 뒤쪽에
이중에 *args와 **kwargs를 포함한 parameter와 argument에 대한 몇가지 사용 예시를 남기고자 합니다.
2. Why? (원인)
- X
3. How? (해결책)
1. kwargs로 받더라도, 다음 내부 클래스에 넘기거나 안넘기거나
- 중간에 파라미터 제거후 나머지 kwargs를 넘기기 : 아래의 경우 args1과 args2는 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
반응형
'Developers 공간 [Shorts] > Software Basic' 카테고리의 다른 글
[Git] git에서 add/commit/push를 했는데 다시 돌리고 싶다 (0) | 2025.04.29 |
---|---|
[PyTorch] Tensor와의 기본연산시 Broadcasting 문제 (0) | 2025.04.29 |
[Bash] 여러개의 Disk를 모아서 mount하기 (0) | 2025.04.28 |
[PyTorch] scaled dot product에서 Attention Map 디스플레이 하기 (0) | 2025.04.10 |
[Bash] Rsync활용하기 (0) | 2025.03.17 |