관리 메뉴

ARTIFEX ;)

*args, **kwargs 이해 본문

# Develop or Testing/Hack for Python

*args, **kwargs 이해

Artifex_Ethan_ 2020. 4. 17. 22:00
반응형

대부분 *args, **kwargs는 함수를 정의할 때 사용된다.

*args와 **kwargs는 가변 갯수의 인자들을 함수에 넣어준다.

# *args  == arguments

# **kwargs == Keyword Arguments.

 

# *args 사용법

이 지시어는 몇 개의 인자를 받아야할 지 몰라 다 수의 인자를 함수로 받고자 할 때 쓰인다.

자 무슨 말이냐면, 아래 코드를 보자.

/*

def testing_code(*numb):

       for num in numb:

             print("%s %s" % (num[0], num[1:3]), end=' ')

       print("\n")

 

testing_code('1')

testing_code('1','2')

testing_code('1','2','3')

*/

위에 코드를 보면 tuple 형태로 구성되어 있고 여러 개의 인자로 함수를 호출할 경우, 함수 내부에서는 튜플로 값을 받은 것처럼 처리한다.

*args는 키워드되지 않은 가변 갯수의 인자들을 함수에 보낼 때 사용한다.

 

 

# **kwargs 사용법

키워드된 가변 갯수의 인자들을 함수에 보낼 때 사용하며,

*args와 마찬가지로 몇개의 인자를 받아야할지 모를 때 사용하는데 Keyword로 된 args값을 인자로 받는다.

Ex -> key : value 이런식으로.

 

[예제 - **kwargs]
def introduceName(**kwargs):
  for key, value in kwargs.items():
    print("{0} is {1}".format(key, value))

introduceName(Name='Jason')
>>> Name is Jason 이 출력된다.

 

key = value 형태로 함수를 호출할 수 있으며, 그것은 그대로 딕셔너리 형태로 {'key':'value'} 와 같이 함수 내부로 전달된다.

*items() : 사전 데이터(key + value 한 쌍)을 Return(dict_items)

 

# 언제 사용하나?

사용 목적에 따라 다르지만, 일반적으로 함수의 *데코레이터를 만들거나, *몽키 패칭을 할 때도 사용할 수 있다.

 

*데코레이터 :

메인 구문이 있고, 여기에 부가적인 구문을 추가하고 싶을 때 사용한다.

그리고 이 부가적인 구문을 반복해서 사용하고 싶은 경우도 있다. 이때 부가적인(그리고 반복적인) 작업을 decorator 로 선언해서 자유롭게 사용이 가능하다는 것이다. 

*몽키패칭(Monkey Patch) : 

프로그램을 확장하거나, 로컬 시스템 소프트웨어를 지원하고 수정하는 방법이다.(그냥 런타임 중 코드를 수정한다는 의미) - 오직 실행중인 프로그램의 인스턴스에 영향을 미친다. 

+ 런타임상에서 함수, 메서드, 속성을 바꾸는 것을 말한다.

   코드가 없는 서드파티 제품을 사용하는 중 기능을 변경하거나 확장 등을 위해 사용하며, 런타임 실행중 메모리상의 오브젝트에 적용된다.

   (C#,Swift의 경우 기능변경은 불가하지만, 확장은 가능하도록 설계했다.)

 

(중구난방하게 작성된 느낌이 있어서 나중에 다시 정리할 때 다듬어 봐야겠다)

반응형