다운로드
작성자: admin 작성일시: 2016-08-04 10:19:07 조회수: 825 다운로드: 207
카테고리: Python 태그목록:

Traits 패키지 소개

파이썬은 동적 타입(Dynamic Type) 언어이다. 즉 변수가 특정한 자료형의 값만 가지도록 강제하지 않는다. 이러한 특성은 코드를 단순하게 하고 개발 속도를 향상시키지만 유지 보수가 어려워진다는 단점도 가진다.

traits 패키지는 enthought 사에서 만든 파이썬 패키지로서 특정한 자료형을 가진 클래스 속성을 만들 수 있게 한다. 이렇게 만들어진 속성에 대해서는 옵저버 패턴(observer pattern)을 구현하여 값이 할당될 때 마다 실시간으로 자료형 검사를 하거나 이벤트 처리를 하게 된다. 또한 traitsui 라는 추가 패키지를 통해 클래스 인스턴스 편집을 위한 GUI 다이얼로그를 자동을 생성해주는 기능도 제공한다.

HasTraits 클래스

traits 패키지의 기능을 사용하기 위해서는 HasTraits를 상속하는 클래스를 만들어야 한다. 이 클래스의 속성에 대해서는 다음과 같이 자료형을 지정할 수 있다. 지정할 수 있는 자료형를 일부만 예를 들면 다음과 같다.

  • Bool
  • Int
  • Long
  • Float
  • Str
  • Dict
  • List

이렇게 단순한 자료형 이외에도 ListStr 또는 DictStrInt 등의 복잡한 자료형도 지정할 수 있다.

In:
from traits.api import HasTraits, Int

class Rectangle1(HasTraits):
    width = Int(2)
    height = Int(2)
In:
r1 = Rectangle1()
In:
r1.width
Out:
2
In:
r1.width = 4

처음에 지정한 자료형이 아닌 다른 자료형을 할당하는 경우에는 에러를 출력한다.

In:
r1.width = "4"

TraitErrorTraceback (most recent call last)
 in ()
----> 1 r1.width = "4"

/home/dockeruser/anaconda2/lib/python2.7/site-packages/traits/trait_handlers.pyc in error(self, object, name, value)
    170         """
    171         raise TraitError( object, name, self.full_info( object, name, value ),
--> 172                           value )
    173 
    174     def full_info ( self, object, name, value ):

TraitError: The 'width' trait of a Rectangle1 instance must be an integer (int or long), but a value of '4'  was specified.
In:
r1.width = 3.14

TraitErrorTraceback (most recent call last)
 in ()
----> 1 r1.width = 3.14

/home/dockeruser/anaconda2/lib/python2.7/site-packages/traits/trait_handlers.pyc in error(self, object, name, value)
    170         """
    171         raise TraitError( object, name, self.full_info( object, name, value ),
--> 172                           value )
    173 
    174     def full_info ( self, object, name, value ):

TraitError: The 'width' trait of a Rectangle1 instance must be an integer (int or long), but a value of 3.14  was specified.

이벤트 처리

다음과 같이 traits 속성의 값이 변화할 때마다 처리될 이벤트를 지정할 수도 있다.

In:
from traits.api import on_trait_change

class Rectangle2(HasTraits):
    width = Int(2)
    height = Int(2)
    area = Int(4)
  
    @on_trait_change('width')
    @on_trait_change('height')
    def calc_area(self):
        print("area changed!")
        self.area = self.width * self.height
In:
r2 = Rectangle2()
In:
r2.area
Out:
4
In:
r2.width = 5
area changed!
In:
r2.area
Out:
10

traitsui 패키지

traits.ui 패키지를 사용하면 HasTraits 클래스 객체의 값을 보거나 편집할 수 있는 GUI 다이얼로그를 자동으로 생성할 수 있다. 다만 traits.ui 패키지는 Jupyter notebook에서는 동작하지 않으므로 GUI가 가능한 로컬 컴퓨터에서 실행해야 한다.

In:
from traits.api import HasTraits, Str, Int
import traitsui

class SimpleEmployee(HasTraits):
    first_name = Str
    last_name = Str
    department = Str
    employee_number = Str
    salary = Int

sam = SimpleEmployee()

예를 들어 위와 같이 SimpleEmployee 클래스의 객체 sam 을 생성한 후 다음 코드를 실행하면,

sam.configure_traits()

아래와 같은 다이얼로그가 나타난다.

이 다이얼로그의 라벨, 에디트 박스, 버튼 등은 모두 traitsui 패키지에 의해 자동으로 만들어진 것들이다. 이 다이얼로그 박스에 값을 입력하면 sam이라는 객체의 속성에 자동으로 할당된다.

만약 다음과 같은 오류가 발생하는 경우에는 IPython이 아닌 일반 python 셸에서 실행시킨다.

API 'QString' has already been set to version 1

질문/덧글

아직 질문이나 덧글이 없습니다. 첫번째 글을 남겨주세요!