본문 바로가기

Python_programming

Python 고정 위치 인자, 가변 위치 인자, 고정 키워드 인자, 가변 키워드 인자 에 대한 고찰

지금부터 정리하는 것은 저의 사견입니다. 틀린 부분이 있음을 주의해주세요! 있다면, 댓글로 알려주시면 정말 감사하겠습니다!

 

파이썬 함수 관련 글에서 "고정" 인자라는 표현은 쓰는 곳이 있고 안 쓰는 곳이 있다. 이 의미는 사실 이미 어딘가에 포함된 의미이고 어찌보면 당연하게 "내장된" 의미라고 생각해서 이에 대한 설명은 자세히 안하는 곳이 더 많은 것 같다. 나와 같이 "고정 인자" 라는 표현을 어딘가에서 봤을 수 있는데 명확히 정리하고 싶은 "정리충"을 위해 굳이 이 글에서 정리해보고자 한다.

 

우선,  파이썬에서 함수를 정의할 때, 

매개변수를 정의할 때, 인자의 갯수가 정해져있는 것(고정)과 정해져있지 않은 것(가변)으로 나뉜다. -> (글쓴이 생각)

좀 더 정확하게는 "고정"의 뜻은 반드시 인자로 전달될 때 명기를 해서 처리한다는 뜻이다.

그리고 이것은 다시 위치 인자와 키워드 인자로 나뉜다. 

 

자, 그러면 인자의 갯수의에 따라  2종류가 여기서 나뉜 다음에 위치와 키워드라는 2종류로 나눈다. 

 

그러면 파이썬에서 함수를 만들 때 인자의 종류는 총 4가지이다.

 

2종류 * 2종류 = 4종류

 

고정 위치 인자, 가변 위치 인자,  고정 키워드 인자, 가변 키워드 인자이다. 

 

위치 인자와 키워드 인자에 대해서는 파이썬 공식 문서에 설명이 나와있다. 

 

 

docs.python.org/ko/3.6/glossary.html

 

용어집 — Python 3.6.13 문서

같은 형의 두 인자를 수반하는 연산이 일어나는 동안, 한 형의 인스턴스를 다른 형으로 묵시적으로 변환하는 것. 예를 들어, int(3.15) 는 실수를 정수 3 으로 변환한다. 하지만, 3+4.5 에서, 각 인자

docs.python.org

 

가변 인자라는 설명도 자주 보인다.

 

 

www.geeksforgeeks.org/args-kwargs-python/ 

 

*args and **kwargs in Python - GeeksforGeeks

A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.

www.geeksforgeeks.org

 

헌데, 고정 인자라는 말이나 표현은 잘 안보인다. (어딘가 있을텐데 굳이 언급을 잘 안하는 것 같다.)

 

왜? 우리가 함수 정의할 때, 애스터리스크(*) 이용해서 가변 인자로 안하고 그냥 자연스럽게 위치 인자랑 키워드 인자로 표현하는 인자들은 모두 "고정" 인자다. 뭐가 고정인데? 매개변수 인자의 갯수가 고정되어 있다. (= 가변이 아니다라는 의미이다) 

좀 더 정확하게는 "고정"의 뜻은 반드시 인자로 전달될 때 명기를 해서 처리한다는 뜻이다.

 

 

가변 인자는 변수의 갯수를 정하지 않고 두는 거다. 0 도 가능하다. 헌데,

고정 인자는? 고정 인자는 정해두면 무조건 넣어줘야 된다. 안그러면 에러가 발생한다. 

 

주피터 노트북에서의 예제를 한 번에 확인해보자.

 

우선, 아래 함수를 정의했다. 모든 인자들이 다 들어가 있다.

 

a,b,c,d -  고정 위치 인자

*args - 가변 위치 인자

e,f - 고정 키워드 인자

**kwargs - 가변 키워드 인자

 

def all_arguments(a,b,c,d, *args, e,f, **kwargs):
    print(locals())

 

여기서 질문!  e 와 f 는 왜 고정 키워드 인자인거지? 

 

파이썬 3.6 버전 공식 문서에서는 

 

 키워드 인자 (keyword argument): 함수 호출 때 식별자가 앞에 붙은 인자 (예를 들어, name=) 또는 ** 를 앞에 붙인 딕셔너리로 전달되는 인자. 예를 들어, 다음과 같은 complex() 호출에서 3 과 5 는 모두 키워드 인자다

 

라고 나와 있는데? 저기에는 식별자 (=) 도 없고 애스터리스크 연속2개(**) 도 없는데? 

 

파이썬은 함수를 호출할 때, 고정 위치 인자, 가변 위치 인자, 고정 키워드 인자, 가변 키워드 인자 순으로 넣어서 처리된다. 이 순서는 함수 정의할 때도 그대로 반영된다.

 

자, 그러면 고정 위치 인자와 고정 키워드 인자는 나왔다. e 와 f 는 자연스레 키워드 인자로 처리가 된다.

(왜? 이미 위치 인자의 순서는 끝났거든! 그래서 키워드 인자로 보는 것이다! )

 

 

 

 

 

 

자, 그러면 인자들을 각각 넣어서 함수를 호출한 케이스의 결과들을 자세히 봐보자.

 

앞에서 가변 인자는 인자가 아무것도 없으면 가변 위치인자 - 빈 튜플 , 가변 키워드 인자 - 빈 딕셔너리 로 나오는 것을 확인할 수 있다. 그래서 가변 인자는 아무것도 없어도 실행되는데 전혀 문제 없다. 

 

헌데, 고정 위치 인자와 고정 키워드 인자들은 분명히 넣어줘야 된다. 

특히 고정 키워드 인자는 함수 정의할 때는 식별자(=) 안 썼는데 호출할 때는 원래대로 식별자(=) 써서 인자를 넣어줘야 한다.

 

자, 그러면 정리해보자.

 

1. 함수에서 고정 인자들은 반드시 꼭 다 넣어줘야 한다.

2. 가변 인자들은 안 넣어줘도 빈 튜플과 빈 딕셔너리로 나온다. 즉, 가변 인자는 0도 포함하는 개념으로 보인다.

3. 키워드 인자는 식별자나 애스터리스크2개 를 붙이는 게 일반적인지만 함수에서 인자의 처리 순서(고정 위치 인자, 가변 위치 인자, 고정 키워드 인자, 가변 키워드 인자)에 따라서 위치 인자처럼만 넣어줘도 키워드 인자가 되는 경우가 있다.

4. 가변 인자가 아니면 다 고정 인자다. 무조건 다 넣어줘야  (초기화 안되어 있다는 전제하에서) 실행이 된다.

 

 

 

간단한 코드니깐 타이핑 해보고 생각을 정리하면 파이썬 함수에서 인자 종류에 대해서 다 정리가 될 것이다.

 

이거 굳이 정리한 이유는 뭔가 맨날 알고 있는데 '고정인자' 포함해서 매개변수 종류들 정리 안하니깐 맨날 어딘가 가려운 느낌이었다. 가려운 부분을 없애기 위해 포스팅 하면서 정리해보았다. 

 

이 내용은 '문용준' 선생님의 저서 '손에 잡히는 파이썬'을 참고해서 작성하였습니다. 정말 좋은 책입니다!

 

----------------------------------------------------------------------------------------

 

 

아무도 안궁금하겠지만, 현재 실행하는 주피터 노트북의 파이썬 버전은 3.8 이다. 왜 3.6 참고하면서 3.8 이냐구요?

(프로젝트 따로 만들때 3.6.8 이나 3.6.10 을 애용하지만 지금 이건 간단한 스터디니깐 3.8이어도 상관없다고 생각해서요 ㅎㅎ)

그리고 keyword-only arguments 는 파이썬 3.7까지 반영되어 있고, 파이썬 3.8 부터는 Positional-Only Parameters 도 반영되어있음!

 

www.python.org/dev/peps/pep-0570/

 

PEP 570 -- Python Positional-Only Parameters

The official home of the Python Programming Language

www.python.org

위 문서 참고