본문 바로가기

Python

4.3. type, str, dir, callable 그리고 기타 내장 함수들

파이썬은 아주 쓸모있는 내장 함수들을 작은 모듬으로 갖추고 있습니다. 기타 모든 함수들은 모듈 안으로 조각조각 들어가 있습니다. 이런 디자인은 실제로 지혜로운 결정이었고, 이 덕분에 코어가 다른 스크립팅 언어들(예, 비주얼 베이직(Visual Basic))과는 다르게 뚱뚱해지지 않을 수 있었습니다. 
 
4.3.1.  type 함수
type 함수는 객체의 데이터유형을 돌려줍니다. 가능한 유형들은 types 모듈에 나열되어 있습니다. 이는 여러 유형의 데이터를 다룰 수 있기 때문에 도움자(helper) 함수에 쓸모가 있습니다. 
 
예제 4.5.  type 소개

 

  1. >>> type(1)           ①
  2. <type 'int'>
    >>> li = []
    >>> type(li)          ②
    <type 'list'>
    >>> import odbchelper
    >>> type(odbchelper)  ③
    <type 'module'>
    >>> import types ④ >>> type(odbchelper) == types.ModuleType True

 

①  type은 무엇이든 -- 정말로 무엇이든 -- 취해서, 그의 데이터유형을 돌려줍니다. 정수, 문자열, 리스트, 사전, 터플, 함수, 클래스, 모듈, 심지어 자기자신조차도 받아 들일 수 있습니다.  
②  type은 변수를 취해서 그의 데이터유형을 돌려줍니다.  
③  type은 또한 모듈에도 작동합니다.  
④  types 모듈에 있는 상수들을 이용하면 객체의 유형을 비교할 수 있습니다. 잠시 후에 보여 드리겠지만, 이것이 바로 info 함수가 하는 일입니다.  
 
 
4.3.2. str 함수
str은 데이터를 문자열로 강제로 변환합니다. 어떠한 데이터 유형도 문자열로 강제로 변환될 수 있습니다. 
 
예제 4.6.  str 소개

 

  1. >>> str(1)          ①
  2. '1'
    >>> horsemen = ['war', 'pestilence', 'famine']
    >>> horsemen
    ['war', 'pestilence', 'famine']
    >>> horsemen.append('Powerbuilder')
    >>> str(horsemen)   ②
    "['war', 'pestilence', 'famine', 'Powerbuilder']"
    >>> str(odbchelper) ③
    ""
    >>> str(None)       ④
    'None'

 

①  정수같이 간단한 데이터유형에 대해서, str이 작동할 것이라 예상하실텐데, 대부분의 언어가 정수를 문자열로 바꾸는 함수가 있기 때문입니다.  
②  그렇지만, str은 어떤 유형의 어떤 객체에도 작동합니다. 여기에서는 여러분이 일일이 손수 구축한 리스트에 작동합니다.  
③  str은 또한 모듈에도 작동합니다. 모듈의 문자열 표현은 디스크에서의 모듈 경로를 포함하므로, 여러분의 출력은 다를 것입니다.  
④  str에서 작지만 중요한 행위는 파이썬 널(null) 값인, None에도 작동한다는 것입니다. 문자열 'None'을 돌려줍니다. 잠시 후에 보여드리겠지만, 이를 info 함수에 이용할 수 있습니다.  
 
info 함수의 심장은 강력한 dir 함수입니다. dir은 객체의 속성과 메쏘드의 리스트를 돌려줍니다: 모듈, 함수, 문자열, 리스트, 사전... 뭐 아무거라도 됩니다. 

 

 

예제 4.7.  dir 소개

 

  1. >>> li = []
  2. >>> dir(li)           ①
    ['append', 'count', 'extend', 'index', 'insert',
    'pop', 'remove', 'reverse', 'sort']
    >>> d = {}
    >>> dir(d) ② ['clear', 'copy', 'get', 'has_key', 'items', 'keys', 'setdefault', 'update', 'values']
    >>> import odbchelper
    >>> dir(odbchelper)   ③
    ['__builtins__', '__doc__', '__file__', '__name__', 'buildConnectionString']
 
①  li는 리스트입니다. 그래서 dir(li)는 리스트의 모든 메쏘드를 담은 리스트를 돌려줍니다. 주의할 것은 반환된 리스트에는 메쏘드의 이름이 문자열로 담겨있지, 메쏘드 자체가 들어가 있는 것이 아니라는 것입니다. ②  d는 사전입니다. 그래서 dir(d)는 사전 메쏘드의 이름들을 담은 리스트를 돌려줍니다. 이 메쏘드들 중 적어도 keys는 틀림없이 눈에 익을 것입니다.  
③  이곳이 정말 흥미로와지는 곳입니다. odbchelper는 모듈입니다. 그래서 dir(odbchelper)는 그 모듈에 정의된 온갖 것들을 리스트에 모두 담아 돌려줍니다. 내장 속성을 비롯하여, __name__과 __doc__ 그리고 여러분이 정의한 속성과 메쏘드를 모두 담고 있습니다. 이 경우, odbchelper는 제 2 장에서 설명한 단 한 개의 사용자-정의 메쏘드 buildConnectionString 함수가 있습니다.  
 
마지막으로, callable 함수는 객체를 취해서 그 객체가 호출가능하면 True를 돌려주고, 그렇지 않으면 False를 돌려줍니다. 호출가능 객체에는 함수와 클래스 메쏘드 그리고 심지어 클래스도 포함됩니다. (다음 장에서 클래스에 관하여 더 자세히 다룹니다.) 

 

 

예제 4.8.  callable 소개

 

  1. >>> import string
  2. >>> string.punctuation           ①
    '!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'
    >>> string.join                  ②
    <function join at 00C55A7C>
    >>> callable(string.punctuation) ③
    False
    >>> callable(string.join)        ④
    True
    >>> print string.join.__doc__    ⑤
    join(list [,sep]) -> string

        Return a string composed of the words in list, with
        intervening occurrences of sep.  The default separator is a
        single space.

        (joinfields and join are synonymous)

 

①  (많은 사람들이 여전히 join 함수를 사용하고 있음에도 불구하고) string 모듈에 있는 함수들은 추천되지 않습니다. 그러나 이 모듈에는 쓸모있는 상수가 많이 담겨 있습니다. 예를 들어 이곳의 string.punctuation 상수에는 표준 구두점 문자들이 모두 들어 있습니다. 
②  string.join은 문자열의 리스트를 연결하는 함수입니다. 
③  string.punctuation은 호출이 불가능합니다; 문자열이기 때문입니다. (문자열은 호출가능한 메쏘드들을 가지지만, 문자열 그 자체는 호출이 불가능합니다.)  
④  string.join은 호출이 가능합니다; 두 개의 인자를 취하는 함수입니다.  
⑤  호출가능한 객체라면 모두 문서화 문자열(doc string)을 가질 수 있습니다. 한 객체의 속성에다 callable 함수를 사용하면 어느 속성(메쏘드, 함수, 클래스)에 신경을 쓸지 그리고 어느 속성(상수, 등등)을 무시하고 싶은지 결정할 수 있습니다. 미리 그 객체에 관하여 알 필요가 없습니다.  
 
 
4.3.3. 내장 함수
type, str, dir, 그리고 나머지 파이썬의 내장 함수들은 모두 이른바 __builtin__이라고 부르는 특별한 모듈로 무리지어져 들어가 있습니다 (앞과 뒤에 밑줄문자가 두개입니다.). 파이썬이 시작시에 자동으로 from __builtin__ import *를 실행하는 것이라고 편하게 생각해도 좋습니다. 이렇게 하면 모든 “built-in” 함수들이 이름공간으로 반입되고 그래서 직접 그 함수들을 사용할 수 있습니다. 
 
이런 식으로 생각하면 __builtin__ 모듈에 관한 정보를 얻어서 모든 내장 함수와 속성을 한 그룹으로 접근할 수 있는 이점이 있습니다. 그리고 추측해 보세요. 파이썬에 info라고 부르는 함수가 있습니다. 지금 그 리스트를 손수 둘러보세요. 더 중요한 함수들을 나중에 깊이 다루어 보겠습니다. (AttributeError 같은 내장 에러 클래스는 이미 눈에 익으실 겁니다.) 
 
예제 4.9. 내장 속성과 함수

 

  1. >>> from apihelper import info
  2. >>> import __builtin__
    >>> info(__builtin__, 20)
    ArithmeticError      Base class for arithmetic errors.
    AssertionError       Assertion failed.
    AttributeError       Attribute not found.
    EOFError             Read beyond end of file.
    EnvironmentError     Base class for I/O related errors.
    Exception            Common base class for all exceptions.
    FloatingPointError   Floating point operation failed.
    IOError              I/O operation failed.

    [...snip...]

 

☞ 파이썬에는 훌륭한 참조 매뉴얼이 따라옵니다. 파이썬이 제공하는 모든 모듈들을 배우려면 이를 철저히 정독하여야 하겠습니다. 그러나 파이썬은 대체로 자체로-문서화되어 있습니다. 파이썬과는 다르게 대부분의 다른 언어에서 이런 모듈의 사용법을 기억해 내려면 맨 페이지나 매뉴얼을 다시 몸소 참조해야 합니다.