[python] 문자열로 그 이름을 가진 속성에 접근하기

Key-Value coding in Python

파이썬에서 키-밸류코딩(문자열을 통해 특정 멤버변수 혹은 로컬변수에 접근)하는 방법에 대해 알아보자.

전역변수 혹은 지역 변수에 대해 문자열로 접근하기

globals() , locals() 함수는 각각 전역변수와 지역변수의 키-값 쌍을 사전으로 반환한다. 따라서 locals()['someVar']라고 쓰면 지역변수 someVar의 값을 구할 수 있다. 이 방법은 파이썬2, 파이썬3에서 공통적으로 사용 가능하다.

객체의 속성값(멤버)에 대해 문자열로 접근하기

getattr(), setattr()을 사용하면 특정한 객체 내부의 값에 대해 문자열로 접근할 수 있다.

호출 가능한 속성인지 확인하기

파이썬에서는 객체의 속성에 대해 객체인지, 값인지 (파이썬은 상수도 객체로 인식한다.) 혹은 함수인지 (파이썬은 함수도 객체로 인식한다.) 아리송할 때가 있다. 이 때는 callable()함수를 사용해서 해당 객체를 넣어주면 호출 가능한지 아닌지 알 수 있게 된다. (호출 가능한 속성은 내부적으로 다시 call 함수가 정의되어 있다. 클래스를 정의할 때도 해당 클래스의 call 함수를 정의해두면 클래스 이름을 함수처럼 사용할 수 있다.

def viewAttrs(obj):
    for ar in dir(obj):
        if callable(getattr(obj,ar)):
            print "Callable >> %s : %s\n\n" % (ar, getattr(obj,ar).__doc__)
        else:
            print "Property >> %s : %s\n\n" % (ar, getattr(obj,ar).__doc__)

위 코드는 특정 객체를 받아, 해당 객체의 모든 속성을 조사하여 실행 가능한지 여부와 함께, 해당 속성의 문서화된 정보를 표시해준다. 참고로 hasattr()도 있고, 이는 당연히 객체가 주어진 이름을 갖는 속성을 가지고 있는지 알아내는 함수이다. [python] 문자열로 그 이름을 가진 속성에 접근하기 더보기

Flask 설치하기

Flask

Flask는 아마도 Pyramid보다도 더 작은 미니멀한 웹 프레임워크로 보인다. 역시나 자세한 설명은 생략한다 홈페이지에서.

설치

eazy_install로 한 방에 할 수도 있는데, 아무래도 가상 환경(virtualenv)을 사용하면 좀 더 깔끔하다. 홈페이지에 소개되어 있는 설치 방법

  • 가상환경은 virtualenv 패키지로 간단히 생성할 수 있다. virtualenv 패키지는 easy_install로 설치할 수 있음
  • c:\> python27\scripts\virtualenv fenv
  • c:\> cd fenv
  • c:\fenv> scripts\activate
  • 이 시점에서 프롬프트가 바뀌고 가상환경이 활성화되었음을 알 수 있다.
  • (fenv) c:\fenv> pip install Flask

다음은 홈페이지에서 소개하고 있는 간단한 예제이다.

from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello World!"

if __name__ == "__main__":
    app.run()

가상환경이 activate되면 가상 환경을 처음 생성한 버전의 파이썬이 기본으로 실행된다.

(fenv) c:fenv> python hello.py

한 후 http://localhost:5000/ 으로 접속하면 역시 익숙한 문구가 눈에 보일 것이다.

[Python] 초간단 Sqlite3 사용 예제

다음 코드는 SQLite3를 통해 테이블을 만들고 (그전에 있으면 없애버리고) INSERT, SELECT, UPDATE, DELETE를 모두 한 번씩 해보는 예제이다. 쿼리를 만들고 실행하는 방법에 대해 보기 편하라고 만든 예제라 별도의 함수화 같은 건 하지 않았다. [Python] 초간단 Sqlite3 사용 예제 더보기

윈도 시스템에 Pyramid 설치하기

윈도 시스템에 Pyramid 설치하기

Pyramid란?

Pyramid는 파이썬기반의 경량 프레임워크이다. 자세한 설명은 생략한다. 링크를 참조하자. Pyramid

설치

준비물

Pyramid를 설치하려면 다음의 내용들이 필요하다.

  • Python 2.7 혹은 3.0
  • pywin32 – 설치되어 있는 파이썬 버전과 동일한 버전을 설치해야 한다. 다운로드는 sourceforge에서 내려받을 수 있다.
  • easy_install – 파이썬 패키지를 자동으로 내려받을 수 있도록 하는 도구. 없다면 ez_setup.py를 내려받아 python ez_setup.py 로 설치하면 된다.
  • virtualenv

설치 순서 (python 2.7/3.2)

  1. virtualenv를 설치한다. c:\> c:\python27\scripts\easy_install virtualenv
  2. 가상 환경을 만들어 준다 c:\> c:\python27\scripts\virtualenv --no-site-packages env
  3. 가상 환경 디렉토리로 이동 c:\> cd env
  4. 이 위치에서 Pyramid를 설치한다. c:\env\> c:\python27\script\easy_install pyramid

버전에 따른 차이는 pywin32의 버전만 동일하게 맞추면 된다. 또한 만약 여러 버전이 설치된 시스템에서는 각 버전에 맞게 따로 따로 가상환경을 만들고 설치한다.

Pyramid 예제 실행

가상환경에서의 파이썬 인터프리터는 c:\env\scripts 에 위치해 있다. Pyramid를 사용하는 파일을 작성한 후에는 c:\env\scripts\python 파일.py로 실행한다.

다음은 Pyramid 홈페이지에 나와있는 간략한 코드.

from wsgiref.simple_server import make_server
from pyramid.config import Configurator
from pyramid.response import Response

def hello_world(request):
    return Response('Hello %(name)s!' % request.matchdict)

if __name__ == '__main__':
    config = Configurator()
    config.add_route('hello', '/hello/{name}')
    config.add_view(hello_world, route_name='hello')
    app = config.make_wsgi_app()
    server = make_server('0.0.0.0', 8080, app)
    server.serve_forever()

실행시에는 c:\env\scripts\python sample.py로 실행한 후 웹 브라우저로 localhost:8080/hello/ 로 접속하면 낯익은 문구가 반겨줄 것이다.

[Python101] Iterable(3) – 튜플

튜플(tuple)은 ‘한 벌’의 의미로 의미상으로는 가장 원시적인 배열이다. 튜플 한 번 만들어지고 나면 수정이 불가능한 집합이다. 쉽게 말해서 리스트를 ‘얼리면’ 튜플이 된다.

튜플을 만드는 법

리스트를 정의할 때는 대괄호에 원소들을 써서 생성했다. 튜플의 경우에는 괄호에 원소들을 써서 만들 수 있다. 아래의 b는 터플이다.

a = [1, 2, 3, 4]
b = (1, 2, 3, 4)

터플의 원소는 리스트와 마찬가지의 방법으로 접근할 수 있다. 터플 이름 뒤에 대괄호를 쓰고 그 속에 인덱스를 넣으면 된다.

b[2] # --> 3
b[:2] # --> (1, 2)

재밌는 사실 하나. 원소가 하나 밖에 없는 튜플을 만드려면 어떻게 해야할까? (1)이라고 쓰면 이는 수식 자체로 숫자 1과 아무런 차이가 없다. 대신 (1, ) 이라고 쓰면 이는 숫자 1을 원소로 갖는 튜플이 된다.

튜플의 메소드

튜플은 count, index의 두 개의 메소드만 제공한다. 튜플의 특정한 원소를 변경하거나, append, remove, pop, insert 등의 기능은 수행할 수 없다.

그러면 이렇게 한정적인 기능만을 수행하는 튜플을 왜 사용할까? 리스트의 경우 한 번 만들어진 이후에 변경이 가능한 점 때문에 처리하는 데 ‘속도’가 느려질 수 있다. 매우 큰 집합을 포함하는 리스트의 중간에 새로운 원소를 끼워넣거나, 중간에 있는 특정한 원소를 제거하는 것은 제아무리 빠른 컴퓨터라할지라도 꽤나 피곤한 일인 것이다. 이런 “변경 가능한 특성” 때문에 리스트는 편리한 대신 처리속도가 느리다. 튜플은 변경 가능한 특성이 없고 오직 고정되어 있는 리스트이기 때문에 원소를 검색하거나 하는 데 시간이 거의 걸리지 않는다.

사실 리스트를 이해하면 튜플은 그냥 이해하고 있는 것과 다름없다. 원소를 변경하거나 정렬하는 등의 동작을 할 수 없지만 그냥 무식하게 빠르다고 생각하면 된다.

길이를 구하거나 정렬하기 – 내장함수의 경우

튜플은 변경과 관련된 메소드를 가지고 있지 않지만, 대신 기본 내장 함수들 sorted(), len()에서는 적용할 수 있다. 즉 (2,5,7,3,4,1,9)와 같은 튜플은 sorted() 함수를 써서 ‘정렬된 리스트’를 얻을 수는 있다.

b = (2,6,3,7,4,1,9)
c = sorted(b)
print c
# --> (1, 2, 3, 4, 6, 7, 9)

튜플의 이름은 역시 자료형인 동시에 튜플로 변환하는 함수이기도 하다. tuple() 함수는 리스트를 얼리거나, 문자열을 쪼개어 터플로 만들어준다.

>>> a = 'attributes'
>>> b = range(0,10,4)
>>> ta = tuple(a)
>>> tb = tuple(b)
>>> ta
# --> ('a', 't', 't', 'r', 'i', 'b', 'u', 't', 'e', 's')
>> > tb
# --> (0, 4, 8)
>>> len(ta)
# --> 10
>>> sorted(ta)
# --> ['a', 'b', 'e', 'i', 'r', 's', 't', 't', 't', 'u']

이제 다음 시간에는 다른 자료형인 ‘사전(dictionary)’에 대해 알아보기로 하겠다. 사전형은 이름이 있는 원소들을 다루는 멋진 자료형이다.