'Python'에 해당되는 글 2건

  1. 2017.10.20 Python class의 static 멤버 변수
  2. 2011.07.27 Python-Twitter
Tips2017. 10. 20. 01:32

재밌는 현상을 발견해서 포스팅을 남긴다.


Python으로 class를 지정해서 코딩할 때, 한 클래스 내에서 리스트를 사용할 일이 있어서 다음과 같은 형태로 클래스를 정의했다.


class foo:
    name    = None
    foo_list = []


해당 클래스의 객체를 여러개 만든 뒤, 들어오는 input에 대해 name을 확인하여 각기 다른 foo 객체의 foo_list에 삽입하도록 했다. 

이후 여러 foo 객체를 오가며 foo_list에 삽입된 항목들을 출력하도록 했더니... 오잉? 모든 항목이 동일한 리스트에 들어가 있는 것이 아닌가?


열심히 디버깅 하다가 미심쩍은 부분이 있어서 다음과 같이 변경하였다.


class foo:
    name    = None
    foo_list = None
    def __init__ (self):
        foo_list = []


그러고 나니 각 객체 별로 별도의 리스트를 잘 출력하는 것이었다.

그러니까, class의 멤버 변수를 정의할 때, 초기값을 바로 때려넣어버리면 그게 일종의 static type이 되어서 모든 객체에서 공유하는 멤버 변수가 되는 것이었다. 수정한 코드와 같이 init을 통해 객체가 생성될 때 리스트를 선언하여 사용하면 각 객체 별로 별도의 리스트를 가질 수 있게 되는 것이다.

뭐, 저 용어들이 엄밀하게 따져서 맞는 용어인지는 모르겠다. 어쨌든 내 전문 분야는 C 언어이고, C 언어의 지식으로 해석해봤을 때 저게 static type (혹은 전역변수)으로 보일 뿐이다.



Posted by 곰푼
Tips2011. 7. 27. 02:42
아직 잘은 모르지만, Twitter의 API를 사용하게 해주는 파이썬의 래퍼 라이브러리(?-이표현이 맞을까)인 듯 하다.

http://code.google.com/p/python-twitter/


위의 URL로 들어가면 해당 프로젝트의 웹 페이지가 나온다.

먼저
 


각각 json, http, oauth에 관한 라이브러리 패키지들이다. 파이썬-트위터가 위 패키지들에 의존적이므로 미리 설치해두는 편이 무자비한 탈모증상을 막는데 도움이 될 것이다.

각각 패키지의 설치법은 리눅스를 기준으로,

$sudo python setup.py install


이 명령어면 대부분 될 것이다.

다만 내 경우 세번째 패키지를 설치할 때 다소 시행착오가 있었는데, simplejson 패키지에서 ez_setup.py파일을 복사해서 이 코드부터 실행시킨 뒤에 위의 명령어를 날려주면 가뿐할 것이다.

그런 다음, google의 프로젝트 페이지에서 소스코드를 다운받아서

$sudo python setup.py build
$sudo python setup.py install


을 입력해주면 설치가 금방 끝날 것이다. 끝나고 난 뒤, 테스트로

$python twitter_test.py


와 같은 명령으로 제대로 되는지를 테스트해볼 수 있다고 하지만, 내 경우에는 에러메시지만 출력하였다.

자 라이브러리를 설치했으니, 뭔가 테스트해봐야할 것이다.

원래대로라면 basic인증이라 해서 아이디와 패스워드만 있으면 바로 트위터 api를 사용가능했다고 한다. 하지만 지금은 OAUTH나 XAuth와 같은 인증을 통하지 않고는 불가능하다고 한다. 보안문제를 위해 조금 더 번거로워 졌다고 보면 되겠다.

OAuth는 트위터에서 사용하는 인증에 대한 표준이다. 트위터의 리드 프로그래머와 구글의 오픈 웹 담당자와 또 모종의 인물이 담합(?)하여 만든 표준이라는데, 나도 정확하게는 모르겠다. 온라인 결제를 위해 사용하는 공인인증방식을 떠올리면 비슷하겠으나, 이와 같은 방법을 표준화했다고 생각하면 될 것 같다.
더 자세히 설명한 포스팅이 있으니 참고하자.


일단 인증을 하기 위해 다음의 페이지로 가서 등록을 하자.

https://dev.twitter.com/apps/new


여기서 *표시된 것은 반드시 작성해야하는 것이며, URL을 적으라고 하는 부분은 http://localhost/와 같이 적어도 무방하다고 한다. 이후 어플리케이션 배포시 제작자와 사용자간에 소통을 위한 것인 듯 하다. 나같은 경우 이 블로그의 주소를 입력하였다.

입력을 마치면 Access level, Consumer Key, Consumer Secret와 같은 여러 항목들이 보일 것이다. Access Level은 짐작컨데 트위터에 대해 읽을수만 있느냐, 쓰기도 가능하냐에 대한 이야기인 것 같다. Consumer Key와 Consumer Secret의 경우, 어플리케이션에 대한 Public Key - Secret Key의 쌍인 듯 하다. 이 키는 언제든 이 페이지에서 볼 수 있다.

그리고 아래에서 Access를 위한 키를 생성하자. 버튼을 누르면 잠시 뒤 생성된다. 이 키값들을 가지고 API를 실행해 볼 수 있다.

먼저 Idle-2.7을 실행시키자.(3.0 이상은 안되는 것 같았다.)

>>> import twitter
>>> api = twitter.Api(consumer_key="key", consumer_secret="secret", access_token_key="token_key", access_token_secret="token_secret")
>>> list = api.GetPublicTimeline()
>>> for i in range(0, list.__len__()):
    print(i, list[i].GetText())

위와 같이 코드를 입력시키면 sample public time line을 받아볼 수 있을 것이다. 위의 Api 객체 생성을 위한 파라미터는 자신의 등록된 키 값으로 적절히 채워넣자. 위와 같은 코드를 실행시키면


위와 같은 결과를 볼 수 있을 것이다.

역시 환경설정이 가장 어려운 것 같다.
일단 오늘은 여기까지...
Posted by 곰푼