python으로 개발하다가 외부라이브러리를 쓰다보면 많이 보는 글자가 바로 *args 또는 **kwargs 다.


한마디로 말해서 어떤 값을 넣을진 모르는데 *args는 값을 넣으면 함수에 변수가 튜플형태로 입력되는 것이고, **kwargs는 딕셔너리 형태로 입력되는 것이라고 보면 된다.


def a(*args):

print args


a(1,2,3,4,)


==> (1,2,3,4)


def b(**kwargs):

 print kwargs


b( a=1, b=2, c=3)


==>{ a:1, b:2, c:3}



예전에 개발 선생님에게 물어봤을 때는 설명해줘도 뭔말인지 잘 몰랐고 왜 써야 하는지도 이해를 못했는데 class를 이용해 객체를 만들어 코딩하는 방법을 사용하다보니 자연스럽게 개념을 알게 되었다.


class를 기반으로 코딩을 하다보면 변수를 일일히 받아야 하는 경우도 있지만 있어도 되고 없어도 되는 그런 변수를 받아야 하는 경우도 있다.


예를 들어 get 방식으로 api를 호출 할때 필수적으로 들어가야 하는 변수들도 있지만 그렇지 않은 변수들도 있다.


http://www.sampleapi.com/api?a=1&b=2&c=3


위와 같은 URL이 있을 때

이 URL을 호출하는데 a변수는 필수적인 변수고 b와 c는 별 상관없는 변수라고 해보자


만약 class를 static하게 만든다고 하면


import requests


class SampleApi:


def __init__(self, url, a, b, c):

self.url = url

self.a = a

self.b = b

self.c = c


def getUrl(self):


url = self.url + "a=" + self.a + "&b=" + self.b + "&c=" +self.c


response = requests.get(url)


return response




sample = SampleApi( "http://www.sampleapi.com/api?", "1", "2","3" )

a = sample.getUrl()



이런 식으로 코딩을 해야 한다.

근데 **kwargs를 쓰면 쓰는 입장에서 변수입력을 보다 간단하게 해결 할 수 있다.



import requests


class SampleApi:


def __init__(self, url, a):

self.url = url

self.a = a


def getUrl(self, **kwargs):


optionUrl = ""


if kwargs.has_key("b"):


optionUrl += "&b=" + kwargs["b"]


if kwargs.has_key("c"):


optionUrl += "&c=" + kwargs["c"]


url = self.url + "a=" + self.a + optionUrl


response = requests.get(url)


return response




sample = SampleApi( "http://www.sampleapi.com/api?", "1" )


#아무런 변수도 입력 안된 경우

a = sample.getUrl()


#변수 b만 입력한 경우

a = sample.getUrl(b="2")


#변수 c만 입력한 경우

a = sample.getUrl(c="3")


#변수 b,c를 모두 입력한 경우

a= sample.getUrl(b="2", c="3")


이전에는 모두 넣어야 했던 것과 달리 원하는 형태로 변경이 가능해진다.


거의 3년이 다 되서야 써먹다니;;;

ㅋㅋㅋㅋ 갑갑한 개발자로다...

+ Recent posts