<< 靈 2 � ↑�� � � 量 靈 4 � HTML 庚靴�� >>

靈 3 �. ∥譴-�� �屬巾��

3.1. ヴ健�� ��≠�

健 �鋼, 그靴� 健 � 健�� 匯� ��鋼 �� � 皇健, ∥譴-��� �健� �頌그甦�槪 ヴ�ヴ. ���ュ≠? 寧ュ 윈壽솥健 健 甄槪 居� 胛�밀ュ ∥譴-�� 꿇�況 꿱껍꺌梟 �ヴ� 恍� 力 �ヴ. 腱, 寧ュ ��� ↔健 껍レヴ.

윈�읒 잽��, 虔돛�ュ �健� �頌그少健 �ヴ. 그 匯�, �甦맑, 그靴� ���� doc string�槪 居�밀 健 �頌그少健 朗�槪 �ュ� �┍∽ �曳健ュ� ⌒簫�劍頌 꿱껍숩�. 잇잴  健, 윈壽솥健 健��� 鰥�ュ ↔�읒 ��윈 ‘穢�� 譁�; 그↔鋼 健 �� 寧蛔�≠ �娛 件健ヴ.

Example 3.1. fileinfo.py

윈壽솥健 껍曳 그峀∽ �� 鰥�ヴ�, 윈壽솥鋼 健↔� 健 甄읒밀 ��들 ヴ患 잇靈�槪 蘆淞 良槪 � �ヴ(Windows, UNIX, Mac OS).

"""Framework for getting filetype-specific metadata.

Instantiate appropriate class with filename.  Returned object acts like a
dictionary, with key-value pairs for each piece of metadata.
    import fileinfo
    info = fileinfo.MP3FileInfo("/music/ap/mahadeva.mp3")
    print "\\n".join(["%s=%s" % (k, v) for k, v in info.items()])

Or use listDirectory function to get info on all files in a directory.
    for info in fileinfo.listDirectory("/music/ap/", [".mp3"]):
        ...

Framework can be extended by adding classes for particular file types, e.g.
HTMLFileInfo, MPGFileInfo, DOCFileInfo.  Each class is completely responsible for
parsing its files appropriately; see MP3FileInfo for example.
"""
import os
import sys
from UserDict import UserDict

def stripnulls(data):
    "strip whitespace and nulls"
    return data.replace("\00", "").strip()

class FileInfo(UserDict):
    "store file metadata"
    def __init__(self, filename=None):
        UserDict.__init__(self)
        self["name"] = filename

class MP3FileInfo(FileInfo):
    "store ID3v1.0 MP3 tags"
    tagDataMap = {"title"   : (  3,  33, stripnulls),
                  "artist"  : ( 33,  63, stripnulls),
                  "album"   : ( 63,  93, stripnulls),
                  "year"    : ( 93,  97, stripnulls),
                  "comment" : ( 97, 126, stripnulls),
                  "genre"   : (127, 128, ord)}

    def __parse(self, filename):
        "parse ID3v1.0 tags from MP3 file"
        self.clear()
        try:
            fsock = open(filename, "rb", 0)
            try:
                fsock.seek(-128, 2)
                tagdata = fsock.read(128)
            finally:
                fsock.close()
            if tagdata[:3] == "TAG":
                for tag, (start, end, parseFunc) in self.tagDataMap.items():
                    self[tag] = parseFunc(tagdata[start:end])
        except IOError:
            pass

    def __setitem__(self, key, item):
        if key == "name" and item:
            self.__parse(item)
        FileInfo.__setitem__(self, key, item)

def listDirectory(directory, fileExtList):
    "get list of file info objects for files of particular extensions"
    fileExtList = [ext.upper() for ext in fileExtList]
    fileList = [os.path.join(directory, f) for f in os.listdir(directory) \
                if os.path.splitext(f)[1].upper() in fileExtList]
    def getFileInfoClass(filename, module=sys.modules[FileInfo.__module__]):
        "get file info class from filename extension"
        subclass = "%sFileInfo" % os.path.splitext(filename)[1].upper()[1:]
        return hasattr(module, subclass) and getattr(module, subclass) or FileInfo
    return [getFileInfoClass(f)(f) for f in fileList]

if __name__ == "__main__":
    for info in listDirectory("/music/_singles/", [".mp3"]): 1
        print "\n".join(["%s=%s" % (k, v) for k, v in info.items()])
        print
1 健 �頌그少� �悚鋼 윈壽솥� �� 뒵맑�읒 マ淞 �ヴ. �藜 �ュ �悚槪 �劍淞�, 윈壽솥鋼 뒵消�靴 ±頌況 力導�밀 윈壽솥� ���읒밀 MP3 �件健 �ュ 뒵消�靴況 ≠花�도刷 � ��≠ �槪 ↔健ヴ.

Example 3.2. Output of fileinfo.py

健↔健 寧� ���읒밀 �鋼 �悚健�ヴ. 윈壽솥� �悚鋼 ヴ況 ↔健ヴ, 그峀� 꿩ヴ�, �� 꿩∽ ��� �읓� 件�頌밀, 윈壽솥鋼 舡�읒 �� 寧� ��� ��槪 �幢 寧ォ∽ � ↔健ヴ.

album=
artist=Ghost in the Machine
title=A Time Long Forgotten (Concept
genre=31
name=/music/_singles/a_time_long_forgotten_con.mp3
year=1999
comment=http://mp3.com/ghostmachine

album=Rave Mix
artist=***DJ MARY-JANE***
title=HELLRAISER****Trance from Hell
genre=31
name=/music/_singles/hellraiser.mp3
year=2000
comment=http://mp3.com/DJMARYJANE

album=Rave Mix
artist=***DJ MARY-JANE***
title=KAIRO****THE BEST GOA
genre=31
name=/music/_singles/kairo.mp3
year=2000
comment=http://mp3.com/DJMARYJANE

album=Journeys
artist=Masters of Balance
title=Long Way Home
genre=31
name=/music/_singles/long_way_home1.mp3
year=2000
comment=http://mp3.com/MastersofBalan

album=
artist=The Cynic Project
title=Sidewinder
genre=18
name=/music/_singles/sidewinder.mp3
year=2000
comment=http://mp3.com/cynicproject

album=Digitosis@128k
artist=VXpanded
title=Spinning
genre=255
name=/music/_singles/spinning.mp3
year=2000
comment=http://mp3.com/artists/95/vxp

3.2. 'from module import'槪 ���윈 匯�槪 �建��

�健�鋼 듬≠� 籃�劍頌 匯�槪 �建�ヴ. � ヴ 傑���, 그靴� 윈壽솥鋼 꿇靈 、、槪 ����況 꿱껍꺌 �ヴ. � ≠� 籃�鋼, import module 乾뎬, 윈壽솥鋼 健藜 靈 1 �읒밀 셜 力≠ �ヴ. ヴ患 籃�鋼  鋼 件槪 マ뭡��梟 藜崍�� 燁��∽ ヴ患 籃�劍頌 虔돛�ヴ.

Example 3.3. Basic from module import syntax

from UserDict import UserDict

健↔鋼 윈壽솥健 꿱� �� 霓껍�ュ import module 깬珞� �며�ヴ, 그壽寧 燁�� 量健瑩健 梧��ュ뎬: �建들 匯�� types� 뱃뭡� 回��ュ 曳閻�劍頌 �을 健華윳을劍頌 �建들ヴ, 그甦밀 그↔�鋼 匯�� 健華읒 ��밀 ��健 쇰윈�� 꿩��도, 曳閻�劍頌 ��健 ≠��ヴ.

Note
�健�읒밀� 'from module import'鋼 �읒밀� 'use module'� �며��; �健�읒밀� 'import module'鋼 �읒밀� 'require module'� �며�ヴ.

Example 3.4. import module vs. from module import

>>> import types
>>> types.FunctionType             1
<type 'function'>
>>> FunctionType                   2
Traceback (innermost last):
  File "<interactive input>", line 1, in ?
NameError: There is no variable named 'FunctionType'
>>> from types import FunctionType 3
>>> FunctionType                   4
<type 'function'>
1 types匯�鋼 回��況 ≠�� 꿩�, �� 、、� �健� ∥譴� �槪 胛� 뱃뭡梟槪 ≠玲ヴ. FunctionType뱃뭡鋼 그 匯�� 健華 types읒 ��윈 ��健 쇰윈�꺌梟 �ヴュ ↔槪 ����.
2 FunctionType 腱譴頌ュ 健 健華×。읒밀 穢��� 꿩뀜ヴ; 그↔鋼 읫頌� types� 珞穫읒밀梟 梧��ヴ.
3 健 깬珞鋼 그 뱃뭡 FunctionTypetypes匯�頌쇰� 曳閻�劍頌 �을 健華 ×。劍頌 �建�ヴ.
4 健靈 FunctionTypetypes槪 �獵� ��꼬健, 曳閻�劍頌 閻깜� � �ヴ.

꿇靈 윈壽솥鋼 'from module import'況 ���꺌 �ュ≠?

그↔恍� ヴ患 ↔�鋼, 그↔鋼 맑�件� 珞靈健ヴ, 그靴� 윈壽솥鋼 듬 ≠� 籃�劍頌 꼈윈玲 �健� ��況 숩∽ � ↔健ヴ.

� 居�꺌 � ↔

3.3. �甦맑況 穢���

�健�鋼 潔솥�∽ ∥譴-���健ヴ: 윈壽솥鋼 腱�梟� �甦맑況 穢�� � ��, 윈壽솥 腱�� 玗鋼 蘆� �甦맑頌쇰� �뱃良槪 � ��, 그靴� 윈壽솥健 穢�� 그 �甦맑況 �譴優� � �ヴ.

�健�읒밀 �甦맑況 穢��ュ ↔鋼 �健�ヴ; ��잴  鋼 ↔읒ュ, 샥⌒頌 솥靴들 乾��健맑 穢�ュ 꼬ヴ. �� 그 �甦맑況 穢��� 그靴� ��槪 맸虔��. �健�� �甦맑ュ 잇��乾 class頌 맸虔��, 그 ヴ舡읒 그 �甦맑� 健華健 �患ヴ. ���劍頌, 그↔健 ��� 匯듬健ヴ, ���� �寧� �甦맑ュ ヴ患 �┱ �甦맑頌쇰� �뱃良껍꺌梟 � ��ュ 꼬� ┐珞健ヴ.

Example 3.5. The simplest Python class

class foo: 1
    pass   2 3
1 健 �甦맑� 健華鋼 foo健ヴ, 그靴� 그↔鋼 ヴ患 �┱ �甦맑頌쇰�도 �뱃良� 꿩ュヴ.
2 健 �甦맑ュ �┱ 뱃뭡健寧 回��도 穢��� 꿩ュヴ, 그壽寧 깬珞�劍頌, 그 穢�읒ュ 朗�乾≠≠ ���ヴ, 그甦밀 �靴ュ pass況 ���ヴ. 健↔鋼 �健�� 잇��頌밀 �� “그� �寧≠�, 윈�읒ュ 섰 ↔健 꼬ヴ”ュ ↔槪 ┥�ヴ. 그↔鋼 껍朗↔도 �� 꿩ュ 밀�珞健ヴ, 그靴� 윈壽솥健 ��寧 �甦맑況 巾맸 밈�� ┐ 그↔鋼 �禾� 胛� �穢腱健ヴ.
3 윈壽솥健 껍譁도 健↔槪 잇��∫�梟, 그壽寧 �甦맑꿴� 匯� ↔鋼 ��, if 밀�珞, for 耘둥健, ��� 꿴읒밀� ��잴 譁�≠�頌, �윈꾄� 들ヴ. �윈꾄��� 꿩鋼 憬 纜櫻 ↔鋼 �甦맑꿴읒 �ュ ↔健 껍レヴ.
Note
�健�읒밀 pass 밀�珞鋼 腱力寧 C 읒밀� �뱉꼬ュ □繇({})잴  ヴ.

蘿速, �靈�劍頌ュ, �쇰솥� �甦맑ュ ヴ患 �甦맑頌쇰� �뱃槪 良槪 ↔健ヴ, 그靴� 그� 腱�梟� �甦맑� 回��잴 뱃뭡槪 穢�� ↔健ヴ. 그壽寧 윈壽솥健 籃� ��셜 力잴  健, 健華 恍�ュ, �甦맑≠ 據��劍頌 ≠葉꺌梟 �ュ ↔鋼 꼬ヴ. �尤寧, C++ �頌그甦蛔�鋼 �健�� �甦맑≠ �맸�乾 깬뭡腱잴 �권腱況 ≠�� 꿩ュヴュ ↔槪 健��ヴ� 휸、��도 匯患ヴ. �健�� �甦맑≠ 깬뭡腱잴 �며� ↔槪 ≠玲ヴ�: __init__ 回��≠ �ヴ.

Example 3.6. Defining the FileInfo class

from UserDict import UserDict

class FileInfo(UserDict): 1
1 �健�읒밀, � �甦맑� 獵�鋼 그 �甦맑 健華딘 □繇꿴읒 �뮈尤 寧읽들ヴ. 그甦밀 FileInfo �甦맑ュ UserDict �甦맑頌쇰� �뱃良ュヴ (그↔鋼 UserDict 匯�頌쇰� �建��ヴ). UserDict ュ ��庚韶 �돛�ュ �甦맑頌밀, 윈壽솥健 그 �� 뎬健��槪 。��∽ �쇰�甦맑優� � �도刷 ��� 윈壽솥 腱�梟� �胛況 偈≠� � �도刷 �影ヴ. (UserListUserString  鋼 �甦맑도 ��밀 윈壽솥鋼 靴맑�잴 珞腱읽槪 �쇰�甦맑優� � �ヴ.) 健 딘읒ュ �。鋼 ��맑壽� 譁輛健 �ヴ, 健 �읒밀 �靴≠ UserDict �甦맑況 �� �健 ��� 숩�밀 �靴ュ 健�읒 그 譁輛槪 ����∽ � ↔健ヴ.
Note
�健�읒밀, � �甦맑� 獵�鋼 그 �甦맑 健華딘� □繇꿴읒 �뮈尤 寧읽들ヴ. ��읒ュ 腱力� extends잴  鋼 �샥� ���ュ 꼬ヴ.
Note
健 甄읒밀 寧ュ 그↔槪 �健 ヴ��ュ 꿩∫�梟, �健�鋼 ヴ燁 �뱃槪 �읏�ヴ. �甦맑 健華 딘況 �花ュ □繇꿴읒, 윈壽솥鋼 읏�ュ ≡� 梟�, �譁頌 깬솥�윈, 獵��槪 寧읽� � �ヴ.

Example 3.7. Initializing the FileInfo class

class FileInfo(UserDict):
    "store file metadata"              1
    def __init__(self, filename=None): 2 3 4
1 �甦맑ュ 匯� 그靴� ��잴 譁�≠�頌 �  健, doc string�槪 �� ≠� � �劍� (그靴� ≠葉꺌梟 �ヴ).
2 __init__鋼 그 �甦맑� � �譴≠ 휸뭡들 �읒 �맸 繇�들ヴ. 健↔槪 그 �甦맑� 깬뭡腱�� 쇰花ュ ↔鋼 �悚�件�도 匯花�梟 쇰穢蟯�ヴ.

�悚�健ヴ, ���� 그↔鋼 깬뭡腱잴  健 숩健� (�松�劍頌, __init__ 鋼 그 �甦맑읒밀 穢�들 憬 纜櫻 回��健ヴ), 깬뭡腱庚韶 �돛�� (그↔鋼 �頌健 휸뭡들 그 �甦맑� �譴읒밀 ���ュ 憬 纜櫻 �� 獵、健ヴ), 그靴� ���ュ 깬뭡腱庚韶 �靴� ┐珞健ヴ. (“init”鋼 蟯�尤 깬뭡腱- 鋼 뱃뭡槪 맸��ヴ).

쇰穢蟯�ヴ, ���� 그 ∥譴ュ __init__健 繇��ュ 뮈。��ュ 健藜 깬뭡��葉 �� ┐珞健�, 그靴� 윈壽솥鋼 健藜 그 �甦맑� �頌� �譴읒 �� 傑湧� �獵瑩槪 ≠�� �� ┐珞健ヴ. 그壽寧 __init__鋼 깬뭡腱頌 �健�읒밀 。�� � �ュ ≠� ≠�� ↔健ヴ, 그靴� 그↔鋼 ��  鋼 을�槪 ���ヴ.

3 __init__槪 ���윈, 匯� �甦맑 回��� 憬 纜櫻 乾�ュ 그 �甦맑� �� �譴읒 �� �獵健ヴ. �松�劍頌, 健壽� 乾�ュ �� self�� 健華 禮ュヴ. __init__ 回��읒밀, self ュ 그 �頌健 梟��玲 ∥譴況 ≠靴�ヴ; ヴ患 �甦맑 回��읒밀ュ, 그↔鋼 腱�� 回��≠ 숄淞玲 그 �譴況 �맸�ヴ. 그 回��況 穢�� ┐ 윈壽솥鋼 self況 �맸�劍頌 �穢� ��≠ ��梟, 그 回��況 繇�� ┐읒ュ 윈壽솥鋼 �穢�� 꿩ュヴ; �健�鋼 그↔槪 윈壽솥槪 胛�윈 腱돛�劍頌 偈≠� ↔健ヴ.
4 __init__ 回��ュ ��잴 譁�≠�頌 �  健, 乾�況 �譁�� �� � ��, 그靴� 乾�ュ �셜』健 穢� � � ��밀, 그↔�槪 繇�腱읒∽ 묽��劍頌 �∽ �ヴ. 健 ±�읒, filename鋼 �셜 』 None槪 ≠��, 그↔鋼 �健�� null 』健ヴ.
Note
�松�劍頌, 匯� �甦맑 回��� 憬 纜櫻 乾�ュ (�� �譴� �獵瑩鋼) self �� 숄靴�ヴ. 健 乾�ュ C++健寧 腱力읒 �ュ 잇�� this� 을�槪 ���ヴ, 그壽寧 selfュ �健�읒밀 잇��≠ 껍レヴ, �뮈尤 健華禮� ��件 �華健ヴ. 그韶읒도 숄깬��, 그↔槪 self恍� ヴ患 ↔劍頌 쇰花� 譁�; 健↔鋼 ��尤 ∠悚� �松健ヴ.

Example 3.8. Coding the FileInfo class

class FileInfo(UserDict):
    "store file metadata"
    def __init__(self, filename=None):
        UserDict.__init__(self)        1
        self["name"] = filename        2
                                       3
1 ����잴  鋼 �┱ ∥譴-��-�며� 꿇��鋼 깬뭡腱잴 ヴ患 ���槪 “蟯�(extending)”�ヴュ ⌒�槪 ≠�� �ュ뎬, ��읒밀ュ 獵�� 回��ュ 腱믹� 回��≠ ���� �읒 腱돛�劍頌 繇�들ヴ. �健�鋼 健峀∽ �� 꿩ュヴ; 윈壽솥鋼 �� �맸�劍頌 獵� �甦맑� �據� 回��況 繇��꺌梟 �ヴ.
2 寧ュ 윈壽솥읒∽ 健 �甦맑ュ ��庚韶 �돛�ヴ� 恍�ヴ, 그靴� 윈�읒 그壽� 憬纜櫻 攘�≠ �ヴ. �靴ュ 그 乾� filename槪 健 ∥譴� name�� 』劍頌 ���ヴ.
3 __init__ 回��ュ 』槪 據�頌 �橒�� 꿩ュヴュ ↔槪 ����.
Note
윈壽솥� �甦맑 回��況 穢�� ┐, 윈壽솥鋼 ��맸 �맸�劍頌 self況, __init__槪 ���윈, 、 回��� 憬 纜櫻 乾�頌 寧읽�꺌梟 �ヴ. 윈壽솥� �甦맑 꿴劍頌쇰� � 獵� �甦맑� 回��況 윈壽솥健 繇��ヴ� , 윈壽솥鋼 ��맸 self 乾�況 ���꺌梟 �ヴ. 그壽寧 윈壽솥健 黎劍頌쇰� �甦맑 回��況 繇��ヴ�, 윈壽솥鋼 self 乾�況 胛�윈 껍朗↔도 �穢�� 꿩ュヴ; 윈壽솥鋼 그↔槪 잽�尤 휸簫��, 그靴� �健�健 腱돛�劍頌 윈壽솥 ��읒 그 �譴 �獵瑩槪 偈≠�ヴ. 健↔健 庚舡 숩� 辱�맑笹ヴュ ↔槪 寧도 꿴ヴ; 그↔鋼 �靈頌ュ 匯뮈鋼 껍レヴ, 그壽寧 그↔鋼 匯뮈庚韶 숩健ュ뎬 ���� 그↔鋼 윈壽솥健 껍曳 匯花ュ (의� 그靴� �� 回�� �健�) 깬샥읒 �梧�� ┐珞健ヴ.

祐�!. 寧ュ 그↔健 良껍�健�읒ュ 樓朗 皇ヴュ ↔槪 꿴ヴ, 그壽寧 윈壽솥鋼 그↔� �瑩槪 健��∽ � ↔健ヴ. 匯� �健�� �甦맑�鋼  鋼 籃�劍頌 虔돛�ヴ, 그甦밀 윈壽솥健 �⌒況 ���梟 ��, 윈壽솥鋼 그 匯� ↔槪 �� ↔健ヴ. 윈壽솥健 ヴ患 匯� ↔�槪 慷� �奐��도, 健 �寧梟鋼 ����, ���� 蘆≠ ����뎬 그↔┐珞읒 윈壽솥鋼 �휸� ↔健� ┐珞健ヴ:

Note
__init__ 回��ュ 묽��健ヴ, 그壽寧 윈壽솥健 �寧� 回��況 穢�� ┐, 윈壽솥鋼 그 獵�� __init__ 回��況 �맸�劍頌 繇��꺌 �ヴュ ↔槪 ���꺌 �ヴ. 健↔鋼 �� 件��劍頌 �ヴ: 腱믹健 그 獵�� �胛況 蟯���腱 � ┐ 譁ヴ, 腱믹� 回��ュ ��맸 �맸�劍頌 �據� 맸�읒 �據� 乾�況 ≠��, 그 獵�� 回��況 繇��꺌梟 �ヴ.

� 居�꺌 � ↔

3.4. �甦맑況 �譴優��

�健�읒밀 �甦맑況 �譴優�ュ ↔鋼 曳밈�健ヴ. �甦맑況 �譴優�淞�, �뮈尤 그 �甦맑況 譁� ��乾↔ 庚韶, __init__ 回��≠ 穢�� 乾��槪 ����, 繇� ��. �橒』鋼 �頌健 梟��玲 ∥譴≠ � ↔健ヴ.

Example 3.9. Creating a FileInfo instance

>>> import fileinfo
>>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") 1
>>> f.__class__                                        2
<class fileinfo.FileInfo at 010EC204>
>>> f.__doc__                                          3
'base class for file info'
>>> f                                                  4
{'name': '/music/_singles/kairo.mp3'}
1 �靴ュ (fileinfo 匯�읒밀 穢��) FileInfo �甦맑� �譴況 梟�ヴ 그靴� 그 �頌健 梟��玲 �譴況 순� f읒 ���ヴ. �靴ュ �⌒� �⌒순�, /music/_singles/kairo.mp3況 ��影ヴ, 그↔鋼 "FileInfo'� __init__" 回��읒 �ュ filename乾�頌 �恍健 陵 ↔健ヴ.
2 匯� �甦맑 �譴ュ 蘆� 뱃뭡, __class__況 ≠�ュ뎬, 그↔鋼 그 ∥譴� �甦맑健ヴ. (��� ↔鋼 健↔� ��健 寧� ���읒밀 그 �譴� 蘿靴� �뱉況 ���ヴュ ↔健ヴ; 윈壽솥� ��鋼 ヴ況 ↔健ヴ.) 腱力 �頌그甦蛔�鋼 Class �甦맑읒 鋸밍� �뎬, 그↔鋼 getName 그靴� getSuperclass잴  鋼 回��況 ≠�� ��밀, � ∥譴읒 �� 偈�뎬健� 穢숩況 寓돗�ヴ. �健�읒밀, 健壽� 暎�� 偈�뎬健�ュ "__class__, __name__, 그靴� __bases__"잴  鋼 뱃뭡槪 ��윈 그 ∥譴 腱�읒 ��윈 曳閻�劍頌 ��≠��ヴ..
3 윈壽솥鋼 그 �譴� doc string읒 �� 玗鋼 匯�� 譁�≠�頌 �  健 閻깜� � �ヴ. � �甦맑� 匯� �譴�鋼  鋼 doc string槪 ×傑�ヴ.
4 __init__ 回��≠ 그� filename 乾�況 self["name"]읒 ���タ ┐況 ���ュ≠? 腱, 윈�읒 그 ��≠ �ヴ. �靴≠ 그 �甦맑 �譴況 휸뭡� ┐ ��影 乾�ュ 力頌 __init__ 回��읒 숩蘆�玲ヴ (그 ∥譴 �獵瑩, self잴 �幢 그↔槪 �健�鋼 ×若頌 偈≠� 影ヴ).
Note
�健�읒밀, �뮈尤 ��庚韶 � �甦맑況 繇��밀 그 �甦맑� �頌� �譴況 휸뭡��. ��읒ュ C++ 玗鋼 腱力읒밀 庚韶 껍朗塑 �맸�乾 new 읓�腱ュ 꼬ヴ.

�頌� �譴況 虔뭡�ュ ↔健 �健�ヴ�, 그↔�槪 �권�ュ ↔鋼 �� 릴ヴ. 件��劍頌, �맸�劍頌 �譴況 꼬끄 ��ュ 꼬ヴ, ���� 그↔�鋼 그 �譴�읒 ��들 순��健 �胛況 諒�陵 ┐ 腱돛�劍頌 靈��� ┐珞健ヴ. 回匯靴 ォ���鋼 �健�읒밀 �蘿ヴ..

Example 3.10. Trying to implement a memory leak

>>> def leakmem():
...     f = fileinfo.FileInfo('/music/_singles/kairo.mp3') 1
...     
>>> for i in range(100):
...     leakmem()                                          2
1 leakmem��≠ 繇�� ┐譁ヴ, �靴ュ FileInfo� �譴況 虔뭡�� 그↔槪 그 ��� �을 순�乾, 순� f읒 ���ヴ. 그靴�밀 그 ��ュ f況 �� 靈��� 꿩� 暎��ヴ, 그甦밀 윈壽솥鋼 回匯靴 ォ�況 잇�� ↔健ヴ, 그壽寧 윈壽솥健 �奐 ↔健ヴ. 그 ��≠ 怒寧�, 그 �을 순� fュ �胛況 諒�祿ヴ. 健 맸瑩읒밀ュ, 그 �頌健 휸뭡들, FileInfo� �譴읒 �� �獵≠ � 健� 梧��� 꿩ュヴ (�靴ュ 그↔槪 f 恍�ュ ヴ患 �ニ↔읒도 ���� 꿩뀜� ┐珞健ヴ), 그甦밀 �健�鋼 그 �譴況 �靴 �� �권�ヴ.
2 껍朗靴 皇健 �靴≠ leakmem ��況 繇��ヴ� �윈도, 그↔鋼 據�頌 回匯靴況 ォ�맸�� 꿩槪 ↔健ヴ, ���� �纜, �健�鋼 그 �頌健 휸뭡들 FileInfo �甦맑況 leakmem劍頌쇰� 둥껍읫� �읒 �권� ↔健� ┐珞健ヴ.

健壽� ��� 꾄屬� �裔槪 ���ュ ��� ��ュ “�獵勇� 뭐�(reference counting)” 健ヴ. �健�鋼 휸뭡�ュ 匯� �譴읒 ��윈 �獵 �刷槪 傑��ヴ. 胛� 잇靈읒밀ュ, FileInfo �譴읒 ��윈 읫曳 �寧� �獵梟健 �ヴ : �을 순� f. 그 ��≠ 暎���, 그 순� fュ �胛況 諒�寧�, 그甦밀 �獵勇�ュ 0劍頌 ┮�玲ヴ, 그靴� �健�鋼 그 �譴況 腱돛�劍頌 �권�ヴ.

健� ��� �健�읒밀ュ, �獵勇�뭐�≠ ����, �健�健 윈壽솥槪 ��ヴレ� �岱尤 京뱉� � 꼬ュ �右健 ��ヴ. 梟� 윈壽솥健 밀頌況 �獵�ュ 듬 ⌒� �譴況 휸뭡�ヴ� (잇況 ��, 健燁-읓� 靴맑�乾뎬, 、 ��ュ 그 靴맑�읒밀 力頌 �� �況 ≠靴�ュ �乾�況 ≠玲ヴ), 듬 �譴 匯듬ュ 據�頌 腱돛�劍頌 �권�� 꿩槪 ↔健ヴ. ���� �健�鋼 (穢蟯�∽) 、 �譴읒 �� �獵≠ �� 梧��ヴ� 礪� ┐珞健ヴ. �健� 2.0읒ュ 쇰≠�乾 ���, “�刷-그靴�-京뱉(mark-and-sweep)”�� 숄靴�ュ 꾄屬� �裔健 �ヴ. 그↔鋼 健壽� �靈�乾 귑量섐�槪 꿱껍梗� 뮈橒�獵況 穢蟯�∽ 京뱉� 穢도頌 ���ヴ.

잇�� 迲�� �� �靈頌밀, 蘆≠ �濾� ↔鋼 껍朗도 숩껍�ュ �┶健 꼬劍� �蘿鋼 ��玲ヴ�� �ュ ↔健�ュ뎬, 그壽寧 그↔鋼 �健�읒밀 穢蟯�∽ �  健 件�寧ュ 件健ヴ. 件��劍頌, 윈壽솥鋼 。��∽ 回匯靴 �靴읒 ��윈 慷� �奐� �� �健�健 윈壽솥槪 ��ヴレ� 京뱉�도刷 그�頌 듬�梟 �� 들ヴ.

� 居�꺌 � ↔

3.5. UserDict: �� �甦맑

윈壽솥健 숩뀜�健, FileInfoュ ��庚韶 �돛�ュ �甦맑健ヴ. 健↔槪 �� �깬� 숩� 胛�, UserDict 匯�읒 �ュ UserDict�甦맑況 ��숩腱, 그↔鋼 �靴� FileInfo �甦맑� 獵�健ヴ. 健↔鋼 �샥� ↔鋼 껍レヴ; 그 �甦맑ュ �健�劍頌 꼈윈葉 �劍�, �靴� ��잴 譁�≠�頌 �  健 .py �件읒 ���� �ヴ. �샥�ヴ�, 그↔鋼 윈壽솥� �健�健 밈�들 lib 뒵消�靴읒 ���� �ヴ.

Tip
姜도�� �健� IDE 읒밀, 윈壽솥鋼 'File->Locate... (Ctrl-L)'頌 윈壽솥� �健�壽靴 ±頌읒 �ュ �┱ 匯�健�도 �맸 읽 � �ヴ.

�健�읒밀, 윈壽솥鋼 珞腱읽, 靴맑� 그靴� ���  鋼 蘆� 뎬健��槪 밀��甦맑優� � 꼬ヴ. 健↔槪 숩��� 胛�윈, �健�읒ュ 健壽� 蘆� 뎬健��� �胛況 �蘆蘆ュ ���甦맑≠ ��장ヴ: UserString, UserList, 그靴� UserDict. 穢� 回��잴 �� 回��況 ���윈 ���劍頌�, UserDict �甦맑ュ ��槪 �禾�∽ �蘆恬ヴ, 그壽寧 그↔鋼 �� ヴ患 匯� ↔� 譁�≠�頌 �寧� �甦맑健ヴ, 그甦밀 윈壽솥鋼 그↔槪 �쇰�甦맑優�윈 FileInfo잴  鋼 ��腱 會� ��-�� �甦맑況 靈×� � �ヴ.

Example 3.11. Defining the UserDict class

class UserDict:                                1
    def __init__(self, dict=None):             2
        self.data = {}                         3
        if dict is not None: self.update(dict) 4
1 ��� ↔鋼 UserDictュ �셜 �甦맑健�, ヴ患 �┱ �甦맑頌쇰�도 �뱃들 ↔健 껍レ�ュ ↔健ヴ.
2 健↔鋼 �靴≠ FileInfo �甦맑읒밀 뒨��タ __init__ 力頌 그 回��健ヴ. 健壽� 獵� �甦맑� 乾� �刷鋼 그 腱믹�ュ ヴ花ヴュ ↔槪 ����. 霓ヴ; 穢蟯� 乾��頌 그 獵�槪 繇��ュ � ,、 �쇰�甦맑ュ 腱�梟� 乾� 裔�槪 ≠�� �ヴ. 윈�읒 그 獵� �甦맑ュ (dict 乾�읒 �寧� ��槪 ���劍頌�) 競�優 』槪 穢��ュ �≠� 籃輛槪 ≠玲ヴ. 그↔槪 �靴� FileInfoュ 健��� 꿩ュヴ.
3 �健�鋼 (腱力� ����읒밀ュ “�譴 순� (instance variables)”健�� 숄靴��, C++읒밀ュ “�� 순� (member variables)”�� 숄靴�ュ) 뎬健� 뱃뭡槪 �읏�ヴ, 그↔鋼 � �甦맑� �샥� �譴읒 �� 傑��ュ 뎬健�健ヴ. 健 ±�읒, UserDict� 、 �譴ュ data�ュ 뎬健� 뱃뭡槪 ≠玲ヴ. 健 뱃뭡槪 그 �甦맑� 力�읒 �ュ ��頌 쇰� �獵�淞�, 윈壽솥鋼 그↔읒 윈壽솥健 �寧� ��읒 그↔� 匯�健華劍頌 ��槪 쇰윈� ↔� �  鋼 籃�劍頌, 'instance.data'잴  健, 그 �譴 健華劍頌 ��槪 쇰윈�꺌 � ↔健ヴ. 그 �甦맑� 꿴臆劍頌쇰� 뎬健� 뱃뭡槪 �獵�� 胛�, �靴ュ self況 �� 쇰윈腱頌 ���ヴ. �松�劍頌, 匯� 뎬健� 뱃뭡�鋼 __init__ 回��읒밀 健傑�ュ 』�頌 競�優들ヴ. 그峀�梟, 健↔鋼 ���� 꿩ヴ, ���� �을 순�잴  鋼, 뎬健� 뱃뭡�鋼 그↔�健 庚舡劍頌 �寧� 』槪 ��良槪 ┐ 둥烙�劍頌 ���� ┐珞健ヴ.
4 健↔鋼 健�읒 윈壽솥健 숩� 鰥�槪 깬珞健ヴ (寧ュ 健 甄읒밀 그↔槪 ��� �健 꼬ヴ). 健↔鋼 if 밀�珞健ヴ, 그壽寧 ヴ舡 娛읒 �윈꾄�들 �刷槪 ≠�ュ ��읒,  鋼 娛읒, �瑩 딘읒, �� �⌒� 밀�珞健 �槪 �華健ヴ. 健↔鋼 잽��∽ �輛� 깬珞健ヴ, 그靴� 윈壽솥健 � �刷읒 읫曳 � ⌒� 밀�珞梟槪 ≠� ┐ 그↔鋼 �華굶健 들ヴ. (그↔鋼 譁� C++읒밀 □繇꼬健 �⌒� 밀�珞槪 �穢�ュ ↔� �며�ヴ.) 윈壽솥鋼 健壽� 깬珞槪 ��� � �劍�, �ュ 健��ュ 娛읒 �윈꾄�들 ��況 ≠� �도 �ヴ, 그壽寧 윈壽솥鋼 그 � ヴ況  鋼 �刷읒 ��� �ュ 꼬ヴ.
Note
腱力잴 ����ュ 乾� 靴맑�읒 �� �� 뒨�꾄�況 �읏�ヴ, �, ヴ맸 恍�� �寧� �甦맑ュ 밀頌 ヴ患 ⌒�� 乾�, 玗鋼 밀頌 ヴ患 �� 乾�況 ≠��梟  鋼 健華槪 ≠玲 윈壽⌒� 回��況 ≠� � �ヴ. ヴ患 꿇�읒밀ュ (PL/SQL읒밀 ��尤 ���뎬) ���ュ 乾� 健華읒 �� �� 뒨�꾄�況 �읏�ヴ; �, ヴ맸 恍�� �寧� �甦맑ュ 밀頌 ヴ患 乾� 健華槪 ≠��梟,  鋼 ⌒��  鋼 �� 乾�況 ≠��  鋼 健華槪 ≠�ュ 윈壽⌒� 回��況 ≠� � �ヴ �健�鋼 健 � 匯듬況 �읏�� 꿩ュヴ; 그↔鋼 �� 뒨�꾄�잴  鋼 ��� �┱ ��도 ≠�� 꿩ュヴ. 그� 乾�읒 ��꼬健, __init__ 回��ュ __init__ 回��健� �� __init__ 回��健ヴ. �甦맑� 읫曳 �⌒� __init__ 回��梟健 �槪 � �ヴ, 그靴� 梟� 腱믹 �甦맑≠ __init__ 回��況 ≠玲ヴ�, 그 腱믹健 그↔槪 밀頌 ヴ患 乾� 靴맑�頌 穢�� ��도, 그↔鋼 �� 그 獵�� __init__ 回��況 뒨�껨 ↔健ヴ.
Note
__init__ 回��읒 �ュ, �譴� 匯� 뎬健� 뱃뭡�읒 ��윈 競�優 』槪 �� ����. 그↔劍頌 윈壽솥鋼 健�읒 뒵�� 맸。槪 據�� � �槪 ↔健ヴ.

Example 3.12. UserDict normal methods

    def clear(self): self.data.clear()          1
    def copy(self):                             2
        if self.__class__ is UserDict:          3
            return UserDict(self.data)
        import copy                             4
        return copy.copy(self)
    def keys(self): return self.data.keys()     5
    def items(self): return self.data.items()
    def values(self): return self.data.values()
1 clearュ 穢��乾 �甦맑 回��健ヴ; 그↔鋼 �ニ┐寧 ォ깬읒∽寧 숄靴�葉밀 ×�劍頌 ��≠��ヴ. 匯� �甦맑 回��庚韶, clearュ 그� 憬纜櫻 乾�頌 self況 ≠玲ヴ. (����, 윈壽솥鋼 그 回��況 繇�� ┐ self況 ���� 꿩ュヴ; 그↔鋼 �健�健 윈壽솥 ��읒 ���ュ �┱ ↔健ヴ.) �� 健 �� �甦맑� �셜� ��ボ읒 ����: �靈 ��(data) 槪 뎬健� 뱃뭡劍頌 ����, �靈 ��健 ≠玲 匯� 回��況 穢���, 그靴� 、 �甦맑 回��況 그 �靈 ��읒밀 �皆�ュ 回��頌 籃��橒 맸�ヴ. (윈壽솥健 慷� �靴ュ ±�읒ュ, ��� clear 回��≠ 그� 匯� ��� 그�� 읓�들 』�槪 �靈�ヴ.)
2 �靈 ��� copy 回��ュ �頌� ��槪 �橒�ヴ 그↔鋼 읏甦� ��� (�-』 � 匯듬≠) 穢蟯尤 �  鋼 손�셜健ヴ. 그壽寧 UserDictュ �뮈�∽ self.data.copy頌 籃��橒 � � 꼬ヴ, ���� 그 回��ュ �靈 ��槪 �橒��, 그靴� �靴≠ 읏�ュ ↔鋼 self잴 �  鋼 �甦맑乾 �頌� �譴況 �橒�ュ ↔健� ┐珞健ヴ.
3 �靴ュ __class__ 뱃뭡槪 ���윈 selfUserDict乾≠ 蟯乾�ヴ; 梟� 그峀ヴ�, �靴ュ �燁� ↔健ヴ, ���� �靴ュ UserDict況 손��ュ 籃輛槪 꿱� ┐珞健ヴ: �頌� UserDict況 梟�� 그↔읒 �靴≠ self.data읒 읽�尤 匯껍장 그 玲若 ��槪 ���.
4 梟� self.__class__UserDict≠ 껍レ��, 그壽� selfュ �煌꼬健 UserDict� �┱ �쇰�甦맑健ヴ (껍譁도 FileInfo譁�≠�頌), 健 ±�읒ュ 英 � ��≠ ���ヴ. UserDictュ 그� 腱믹燁� �寧況 穢蟯尤 손��ュ 籃輛槪 꿱� 鰥�ヴ; 잇況 ��, 그 �쇰�甦맑읒 ヴ患 뎬健� 뱃뭡�健 �槪�도 匯患ヴ, 그甦밀 �靴ュ 그↔�槪 耘둥健 �윈 蟯��∽ 그� 匯듬況 손��꺌� ��≠ �槪 ↔健ヴ. ヴ�맑笹∽도, �健�읒ュ 健↔槪 穢蟯尤 ���ュ 匯� �寧≠ ��장ヴ, 그靴� 그↔鋼 copy�� 숄靴�ヴ. 寧ュ 윈�읒밀 뭐쇰��劍頌 ��≠�ュ 꿩∫ヴ (그峀�梟 윈壽솥健 맑맑頌 그↔읒 ヴ健�� ��≠�腱 �ヴ� 그↔鋼 �≠恢尤∽ ��� 匯�健ヴ). copyュ 巾��乾 �健� ∥譴�槪 손�� � �ヴ� 潔솥�∽ 恍�� �劍�, 그靴� 그↔健 �靴≠ 윈�읒밀 ���� �ュ 籃輛健ヴ.
5 그 寧蛔� 回���鋼 曳밈�劍頌, 그 繇��槪 self.data읒 �ュ 蘆� 回���頌 籃� �橒�ヴ.

� 居�꺌 � ↔

3.6. �샥� �甦맑 回��

�甦맑 回��읒 쇰≠�밀, �健� �甦맑≠ 穢�� � �ュ � 皇鋼 ��� 回���健 �ヴ. (ヴ患 穢��乾 回��庚韶) 曳閻�劍頌 繇��ュ ��읒, �� 回��ュ ��� �右 玗鋼 �샥� 깬珞健 ��� ┐ �健�읒 ��밀 윈壽솥槪 ���윈 繇�들ヴ.

윈壽솥健 健 �� 뭏�읒밀 숩뀜�健, 穢� 回��ュ �寧� ��槪 �甦맑頌 몃� 胛�윈 � 윈�槪 �ヴ. 그壽寧 穢� 回��梟劍頌ュ 潔솥�� 꿩ヴ, ���� 그�읒 �� 繇� 回���읒도 윈壽솥健 ��劍頌 � � �ュ 件健 皇� ┐珞健ヴ. 競숩腱頌밀, 윈壽솥鋼 �맸�劍頌 回��況 �京�ュ ↔槪 ���� 꿩ュ 깬珞劍頌 ��槪 寓돗� � �� 그靴� 밈穢� � �ヴ. 健↔健 力頌 �� �甦맑≠ 回��≠ ���ュ ≒健ヴ: 그↔�鋼 �-回��-繇� 깬珞槪 回�� 繇�읒 羊禮� �ュ �寧� 籃輛槪 靈×�ヴ.

Example 3.13. The __getitem__ special method

    def __getitem__(self, key): return self.data[key]
>>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3")
>>> f
{'name':'/music/_singles/kairo.mp3'}
>>> f.__getitem__("name") 1
'/music/_singles/kairo.mp3'
>>> f["name"]             2
'/music/_singles/kairo.mp3'
1 __getitem__ �� 回��ュ 樓朗 �뮈�∽ 숩乾ヴ. 穢� 回�� clear, keys, 그靴� values庚韶, 그↔鋼 �� 그 ��읒 籃��橒�� 그� 』槪 �橒�ヴ. 그壽寧 �┍∽ 그↔鋼 繇��� �ュ≠? 舡, 윈壽솥鋼 __getitem__槪 曳閻�劍頌 繇�� � �ヴ, 그壽寧 ��� 윈壽솥鋼 �靈頌 그峀∽ ��ュ 꿩槪 ↔健ヴ; �� 寧ュ 윈�밀 윈壽솥읒∽ 그↔健 �┍∽ 虔돛�ュ ≠況 숩윈�� 胛� 그↔槪 �� �ヴ. __getitem__槪 穢蟯�∽ ���ュ ↔鋼 �健�健 윈壽솥槪 ���윈 그↔槪 繇��ュ ↔健ヴ.
2 健↔鋼 �� 』槪 寓돗�� 胛�윈 윈壽솥健 ��� 그 깬珞� �  健 숩乾ヴ, 그靴� �靈頌 그↔鋼 윈壽솥健 잇�� 그 』槪 �橒�ヴ. 그壽寧 윈�읒ュ �玲 瑩健 �ヴ: �蛋槪 읽�숩�, �健�鋼 健 깬珞槪 그 回�� 繇� 'f.__getitem__("name")'頌 순橒�ヴ. 그↔健 力頌 __getitem__≠ �� �甦맑 回��乾 健傑健ヴ; 윈壽솥 腱�健 그↔槪 繇�� � �槪 흣梟 껍レ�, 윈壽솥鋼 그 穢蟯� 깬珞槪 ���윈 �健�健 윈壽솥 �� 그↔槪 繇�� � �도刷 � � �ヴ.

Example 3.14. The __setitem__ special method

    def __setitem__(self, key, item): self.data[key] = item
>>> f
{'name':'/music/_singles/kairo.mp3'}
>>> f.__setitem__("genre", 31) 1
>>> f
{'name':'/music/_singles/kairo.mp3', 'genre':31}
>>> f["genre"] = 32            2
>>> f
{'name':'/music/_singles/kairo.mp3', 'genre':32}
1 __getitem__ 回�� 庚韶, __setitem__鋼 �뮈�∽ 그 �靈 ��, self.data 劍頌 籃��橒�� 腱�� 件槪 �ヴ. 그靴� __getitem__庚韶, 윈壽솥鋼 숩� 健塑�劍頌 그↔槪 曳閻�劍頌 繇���ュ 꿩槪 ↔健ヴ; �健�鋼 윈壽솥健 그 穢蟯� 깬珞槪 ��� ┐ 윈壽솥 �� __setitem__槪 繇��ヴ.
2 fュ ��庚韶 숩健淞� 읽�尤 �悚�ュ �靈� �甦맑健�, 그靴� __setitem__鋼 그 胛�� �� 쇰솥健�ュ 瑩梟 蘿速 靈���, 健↔鋼 ��� �� 깬珞 健 숩乾ヴ. 健 �� �乾鋼 �蛋槪 읽�숩� �靈頌 f.__setitem__("genre", 32)況 繇��ヴ.

__setitem__鋼 윈壽솥 ��읒 繇��� ┐珞읒 �� �甦맑 回��健ヴ, 그壽寧 그↔鋼 윈�尤 �甦맑 回��健ヴ. UserDict읒밀 __setitem__回��≠ 릴∽ 穢���健 �健�∽, �靴ュ 그↔槪 �靴� 腱믹 �甦맑읒 �穢� �윈 그 獵� 回��況 뒨�껨 � �ヴ. 健↔劍頌 �靴ュ �┱ �劍頌 ��庚韶 �돛�ュ �甦맑�槪 穢�� � �劍寧 蘆� ��槪 ��밀ュ 腱�梟� �胛況 穢�� � �ヴ.

健壽� ⌒�鋼 健 �읒밀 �靴≠ ×쇰�� �ュ �譴 �屬巾��� �셜��健ヴ. 、 �件 �鋼 �샥� ��� �件劍頌 쇰� 回�뎬健�況 寓돗�ュ 輛槪 꿱� �ュ 庚靴 �甦맑況 ≠玲ヴ. (�件� 健華� 胛�  鋼) �┱ 뱃뭡�槪 꿱∽ ��, 그 庚靴 �甦맑ュ ヴ患 뱃뭡�槪 腱돛�劍頌 �휸맸�ュ 籃輛槪 꿴ヴ. 健↔鋼 __setitem__ 回��況 뒨�꾄�, �샥� ��槪 瑩↑��, 그靴� 그�健 烙¨� ┐ 쇰≠�乾 庚靴況 偈≠�劍頌� ��들ヴ.

잇況 ��, MP3FileInfoFileInfo� 腱믹健ヴ. MP3FileInfo健華(name)健 밈穢� ┐, 그↔鋼 (그 獵� FileInfo≠ 그壽� ↔庚韶) �뮈尤 name �況 밈穢�� 꿩ュヴ; 그↔鋼 �� MP3 �그況 胛� �件 그 腱譴況 �윈ヴ 셜ヴ 그靴� �譴 ��槪 梟�� 恬ヴ.

Example 3.15. Overriding __setitem__ in MP3FileInfo

    def __setitem__(self, key, item):         1
        if key == "name" and item:            2
            self.__parse(item)                3
        FileInfo.__setitem__(self, key, item) 4
1 ��� ↔鋼 �靴� __setitem__ 回��≠ 穢蟯�∽ 그 獵� 回��잴 �  鋼 籃�劍頌 穢�들ヴュ ↔健ヴ. 健↔鋼 燁��ヴ, ���� �健�鋼 �靴況 ���윈 그 回��況 繇�� ↔健� ┐珞健ヴ, 그靴� �健�鋼 그↔健 件穢⌒�� 乾�頌 穢�� ↔健�� 잇��ヴ. (���劍頌 健꺌� �밀, 그 ⌒�庚韶, 乾��� 그 健華�鋼 珞靈≠ �� 꿩ュヴ.)
2 윈�읒 �譴 MP3FileInfo �甦맑� ��健 �ヴ: 梟� �靴≠ �寧� 』槪 name �읒 ���� 寧�, �靴ュ 윈솥� �┱ ↔槪 ��況 읏�ヴ.
3 name槪 胛�윈 �靴≠ �ュ 윈솥� 庚靴�穢鋼 __parse 回��읒 �를優�ュ ↔健ヴ. 健↔鋼 MP3FileInfo읒 穢�들 � ヴ患 �甦맑 回��健ヴ, 그靴� �靴≠ 그↔槪 繇�� ┐, �靴ュ 그↔읒 self頌 ��槪 쇰윈�ヴ. �뮈尤 __parse 頌 繇��� 그 �甦맑 黎읒 穢�� 穢��乾 ��況 黔槪 ↔乾뎬, 그↔鋼 �靴≠ 읏� 力≠ 껍レヴ; self.__parse頌 繇��꺌 그 �甦맑 꿴읒 穢�들 �甦맑 回��況 黔槪 ↔健ヴ. 健↔鋼 샥頌 �頌� ↔健 껍レヴ; 윈壽솥鋼  鋼 籃�劍頌 뎬健� 뱃뭡�槪 �獵�ヴ.
4 �靴≠ 윈솥� 庚靴況 � �읒, �靴ュ 그 獵�� 回��況 繇���況 읏�ヴ. ����, 健↔鋼 �健�읒밀 윈壽솥槪 ���윈 健���� 꿩ュヴ; 윈壽솥鋼 �돛劍頌 그↔槪 � ��≠ �ヴ. ��� ↔鋼 �靴≠ 그 曳閻�乾 獵�乾, 그↔健 __setitem__ 回��況 ≠�� �� 꿩槪 ��도, FileInfo槪 繇��� �ヴュ ↔健ヴ. 그↔鋼 귄�ヴ, ���� �健�鋼 그 獵�� �靴況 �만壽 이�≠ �靴≠ 繇��� �ュ �甦맑況 黔槪 ↔健�, 그甦밀 健 �� �乾鋼 �균읒ュ UserDict읒 穢�들 __setitem__槪 黔껍밀 繇�� ↔健� ┐珞健ヴ.
Note
� �甦맑 꿴읒밀 뎬健� 뱃뭡읒 閻깜� ┐, 윈壽솥鋼 그 뱃뭡� 健華읒 ��槪 娛 ��≠ �ヴ: self.attribute頌. � �甦맑 꿴읒밀 ヴ患 回���槪 繇�� ┐, 윈壽솥鋼 그 回�� 健華읒 ��槪 娛 ��≠ �ヴ: self.method頌.

Example 3.16. Setting an MP3FileInfo's name

>>> import fileinfo
>>> mp3file = fileinfo.MP3FileInfo()                   1
>>> mp3file
{'name':None}
>>> mp3file["name"] = "/music/_singles/kairo.mp3"      2
>>> mp3file
{'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31,
'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3',
'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'}
>>> mp3file["name"] = "/music/_singles/sidewinder.mp3" 3
>>> mp3file
{'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder',
'name': '/music/_singles/sidewinder.mp3', 'year': '2000',
'comment': 'http://mp3.com/cynicproject'}
1 晄�, �靴ュ �件健華槪 �� 꿩�, MP3FileInfo� �譴況 휸뭡�ヴ. (�靴ュ 健↔槪 휸簫� � �ュ뎬 ���� __init__ 回��� filename 乾�≠ 묽��健� ┐珞健ヴ.) MP3FileInfoュ 그 腱�梟� 껍朗塑 __init__ 回��況 ≠�� 꿩劍�頌, �健�鋼 그 獵�� �靴況 �만壽 이�≠ FileInfo__init__ 回��況 黔ュヴ. 健壽� __init__ 回��ュ �돛劍頌 UserDict__init__ 回��況 繇��ヴ 그靴�寧밀 name �況 filename읒 밈穢�ヴ, 그↔鋼 None乾뎬, ���� �靴ュ �件 健華槪 �葉�� 꿩뀜� ┐珞健ヴ. 그靴�윈, mp3fileュ 庚舡劍頌 �寧� �, name槪 ≠玲 ��庚韶 숩乾ヴ, 그 』鋼 None健ヴ.
2 健靈 玲若 �藜≠ 맸虔들ヴ. mp3filename �況 밈穢�� (UserDict≠ 껍レ�) MP3FileInfo읒 �ュ __setitem__ 回��況 經烙맸�ヴ, 그↔鋼 �靴≠ name �읒 �靈 』槪 밈穢�ヴュ ↔槪 꿱껍梗� self.__parse況 繇��ヴ. �靴≠ 그 __parse 回��況 껍曳 偈��� 꿩뀜舡읒도 숄깬��, 윈壽솥鋼 그 �悚劍頌쇰� 그↔健 � ⌒� ヴ患 ��槪 밈穢�ヴュ ↔槪 섰 � �ヴ: album, artist, genre, title, year, 그靴� comment.
3 name �況 순±��  鋼 庚靴�穢槪 � ヴ맸 �∽ � ↔健ヴ: �健�鋼 __setitem__槪 繇��ヴ, 그↔鋼 self.__parse況 繇��ヴ, 그↔鋼 匯� ヴ患 ��槪 밈穢�ヴ.

3.7. 玲숩들 �� �甦맑 回��

�� __getitem__ 그靴� __setitem__ 恍�도 �� 皇鋼 �� 回��≠ �ヴ. 그� 燁 ��鋼 윈壽솥鋼 健靈度 꿱� 鰥�槪 ��槪 �蘆蘆도刷 �윈 影ヴ.

Example 3.17. More special methods in UserDict

    def __repr__(self): return repr(self.data)     1
    def __cmp__(self, dict):                       2
        if isinstance(dict, UserDict):
            return cmp(self.data, dict.data)
        else:
            return cmp(self.data, dict)
    def __len__(self): return len(self.data)       3
    def __delitem__(self, key): del self.data[key] 4
1 __repr__ュ 윈壽솥健 repr(instance)槪 繇�� ┐ 繇��ュ �샥� 回��健ヴ. repr ��ュ � ∥譴� 珞腱읽 ��槪 �橒�ュ 蘆� ��健ヴ. 그↔鋼 �� �甦맑 �譴 흣梟 껍レ�, 匯� ∥譴읒 虔돛�ヴ. 그↔읒 ��윈 꿱� �� 鰥�읒도 숄깬�� 윈壽솥鋼 健藜 repr읒 �� �밍�ヴ. �繇�優�乾 姜도�읒밀, 윈壽솥健 �� 그 순� 健華槪 �健��� ENTER況 � ┐, �健�鋼 repr槪 ���윈 그 순�� 』槪 �悚�ヴ. �。� 뎬健�況 ≠玲 �� d況 虔뭡�윈 윈壽솥 맑맑頌 print repr(d) �윈 꿱껍숩�.
2 윈壽솥健 �甦맑 �譴況 �귑� ┐ __cmp__ュ 繇�들ヴ. 件��劍頌, 윈壽솥鋼 �甦맑 �譴흣梟 껍レ�, �─� 듬 ⌒� �健� ∥譴�도, ==槪 健��윈 �귑� � �ヴ. 蘆� 뎬健��健  ヴ� 。�� ┐읒 穢��ュ 깍�健 �ヴ; 잇況 ��, ��鋼 匯듬  鋼 �잴 』�槪 ≠� ┐ 돛件��, 그靴� 珞腱읽鋼  鋼 굶健健�  鋼 뮈밀� 珞腱�槪 ≠� ┐ 돛件�ヴ. �甦맑 �譴읒 ��윈, 윈壽솥鋼 __cmp__ 回��況 穢�� � �� 윈壽솥 맑맑頌 그 �귑 �靴況 ��� � �ヴ, 그靴� 寧밀 윈壽솥鋼 ==槪 ���윈 윈壽솥� �甦맑� �譴況 �귑� � �� 그靴� �健�鋼 윈壽솥� __cmp__ �� 回��況 윈壽솥槪 ���윈 繇�� ↔健ヴ.
3 __len__ュ 윈壽솥健 len(instance)況 繇�� ┐ 繇�들ヴ. len ��ュ � ∥譴� 굶健況 �橒�ュ 蘆� ��健ヴ. 그↔鋼 굶健況 ≠�� �ヴ� 潔솥尤 。�� 梟� �┱ ∥譴읒도 虔돛�ヴ. � 珞腱읽� len鋼 腱�� 珞腱읽� ⌒�況 ≠玲ヴ; � ��� len鋼 腱�� �� ⌒�況 ≠玲ヴ; � 靴맑� 玗鋼 ��� len鋼 腱�� �뱉� ⌒�況 ≠玲ヴ. �甦맑 �譴읒ュ, __len__ 回��況 穢��� 그靴� 맑맑頌 굶健 �� ��況 梟��, 그靴� 寧밀 len(instance)況 繇��� 그壽� �健�鋼 윈壽솥� __len__ �� 回��況 윈壽솥 ��읒 繇�� ↔健ヴ.
4 __delitem__鋼 윈壽솥健 del instance[key]況 繇�� ┐ 繇�들ヴ, 윈壽솥鋼 그↔槪 ��劍頌쇰� ⌒샥�乾 ���槪 靈��ュ 籃輛劍頌밀 ��� ↔健ヴ. 윈壽솥健 del槪 �甦맑 �譴읒 ��� ┐, �健�鋼 윈壽솥 �� __delitem__ �� 回��況 繇��ヴ.
Note
腱力읒밀, 윈壽솥鋼 듬 ⌒� 珞腱읽 순�≠  鋼 蘿靴� 回匯靴 胛�況 �獵�ュ�況 str1 == str2���윈 �穢�ヴ. 健↔槪 ∥譴 腱�蟯乾 (object identity)�� 쇰患ヴ, 그靴� �健�읒밀 그↔鋼 'str1 is str2'頌 꼈윈玲ヴ. 腱力읒밀 珞腱읽槪 �귑�淞�, 윈壽솥鋼 str1.equals(str2)槪 ��� ↔健�; �健�健��, 윈壽솥鋼 str1 == str2槪 ��� ↔健ヴ. 腱力읒밀� '=='ュ 』숩ヴュ 腱�蟯乾읒 ��밀 �귑況 �� ┐珞읒 腱�� 뭐�健 � 霓鋼 ≒健�� 礪도刷 ��장 腱力 �頌그甦蛔�鋼 �健�읒 그壽� “�禾� ↔ (gotchas)”健 꼬ヴュ ↔읒 ��윈 껍譁도 �±맑塑 맸。�皆健 ��� �도 匯患ヴ.

健 맸瑩읒밀, 윈壽솥鋼 健峀∽ 휸、�� �槪�도 匯患ヴ, “�寧� �甦맑읒밀 朗꿇≠況 �꺌�ヴ� 健 匯� 件�槪 寧ュ 蘆� 뎬健��劍頌 庚靴� � �ヴ.” 梟� 윈壽솥健 ���  鋼 蘆� 뎬健��劍頌쇰� �뱃良槪 � �ヴ� �健 英 � ��� ��ヴュ ↔鋼 ��健ヴ (그靴� �譴 UserDict �甦맑ュ 숄���∽ � ↔健ヴ) . 그壽寧 윈壽솥健 그峀∽ � � �ヴ� �도, �� 回��ュ 윈�尤 傑�� ↔健ヴ, ���� 그↔�鋼 UserDict잴  鋼 �� �甦맑 흣梟 껍レ�, �─� �甦맑읒도 ��� � �� ┐珞健ヴ.

�� 回��� �─� �甦맑도 ���  鋼 �-』 �槪, �� __setitem__回��況 穢��劍頌�, ��� � �ヴュ ↔槪 �藜�ヴ. �─� �甦맑도 �� __getitem__回��況 穢��劍頌� 읓뱃읽庚韶 �돛� � �ヴ. __cmp__況 穢�� 匯� �甦맑ュ ==頌 �귑� � �ヴ. 梟� 윈壽솥� �甦맑≠ 굶健況 ≠玲 �┱ ↔槪 寧�恬ヴ�, GetLength 回��況 穢��� 譁�; __len__ 回��況 穢��� 그靴� len(instance)況 ����.

Note
ヴ患 ∥譴-�� 꿇��健 �� 윈壽솥읒∽ � ∥譴� 蘿靴� 匯뎄槪 穢��도刷 �윈 �ュ ��읒 (“健 ∥譴ュ GetLength 回��況 ≠玲ヴ ”), __len__�  鋼 �健�� �� �甦맑 回��ュ 윈壽솥읒∽ � ∥譴� �靴� 匯뎄槪 穢��도刷 �윈 影ヴ (“健 ∥譴ュ 굶健況 ≠玲ヴ”).

ヴ患 皇鋼 �� 回���健 �ヴ. �甦맑況 밝腱�庚韶 �돛�도刷 �윈 �ュ 回��� 匯� 裔�健 影��� ��밀, �甦맑 �譴읒 ��윈 윈壽솥鋼 ���, 홉� 그靴� ヴ患 匯� �� 庚靴況 � ��ヴ. (健↔� 匯��乾 잇ュ ��쇰잴 ��쇰況 ≠玲, 손뱉�況 寧�蘆ュ �甦맑健ヴ.) __call__ 回��ュ � �甦맑況 譁� ��庚韶 �돛�도刷 �윈 ��밀, 윈壽솥鋼 �甦맑 �譴況 曳閻�劍頌 繇�� � �ヴ. 그靴� ヴ患 �� 回���健 ��밀 �甦맑�健 居�-�� 그靴� 꾄�-�� 뎬健� 뱃뭡槪 ≠�도刷 �影ヴ; �靴ュ 그↔�읒 ��윈 健 �� �읒밀 � 腱뭐尤 ��� ↔健ヴ.

� 居�꺌 � ↔

3.8. �甦맑 뱃뭡

윈壽솥鋼 健藜 뎬健� 뱃뭡읒 ��윈 꿱� �ヴ, 그↔鋼 �甦맑� �샥� �譴≠ 뱉傑�ュ 순��健ヴ. �� �健�鋼 �甦맑 뱃뭡槪 �읏�ヴ, 그↔鋼 그 �甦맑 腱譴≠ 뱉傑�� �ュ 순��健ヴ.

Example 3.18. Introducing class attributes

class MP3FileInfo(FileInfo):
    "store ID3v1.0 MP3 tags"
    tagDataMap = {"title"   : (  3,  33, stripnulls),
                  "artist"  : ( 33,  63, stripnulls),
                  "album"   : ( 63,  93, stripnulls),
                  "year"    : ( 93,  97, stripnulls),
                  "comment" : ( 97, 126, stripnulls),
                  "genre"   : (127, 128, ord)}
>>> import fileinfo
>>> fileinfo.MP3FileInfo            1
<class fileinfo.MP3FileInfo at 01257FDC>
>>> fileinfo.MP3FileInfo.tagDataMap 2
{'title': (3, 33, <function stripnulls at 0260C8D4>),
'genre': (127, 128, <built-in function ord>),
'artist': (33, 63, <function stripnulls at 0260C8D4>),
'year': (93, 97, <function stripnulls at 0260C8D4>),
'comment': (97, 126, <function stripnulls at 0260C8D4>),
'album': (63, 93, <function stripnulls at 0260C8D4>)}
>>> m = fileinfo.MP3FileInfo()      3
>>> m.tagDataMap
{'title': (3, 33, <function stripnulls at 0260C8D4>),
'genre': (127, 128, <built-in function ord>),
'artist': (33, 63, <function stripnulls at 0260C8D4>),
'year': (93, 97, <function stripnulls at 0260C8D4>),
'comment': (97, 126, <function stripnulls at 0260C8D4>),
'album': (63, 93, <function stripnulls at 0260C8D4>)}
1 MP3FileInfoュ 그 �甦맑� �─� �샥� �譴≠ 껍レ�, �甦맑 그 腱譴健ヴ.
2 tagDataMap鋼 �甦맑 뱃뭡健ヴ: 珞腱�劍頌 健꺌��밀, 그 �甦맑� 뱃뭡健ヴ. 그 �甦맑� �─� �譴도 휸뭡���읒 그↔鋼 ��≠��ヴ.
3 �甦맑 뱃뭡鋼 그 �甦맑읒 ��윈 曳閻 �獵況 ��윈 그靴� 그 �甦맑� 匯� �譴況 ��윈 匯듬 ��≠��ヴ.
Note
腱力읒밀, (�健�읒밀ュ �甦맑 뱃뭡健� 쇰花ュ) 穢� 순��� (�健�읒밀ュ 뎬健� 뱃뭡健�� 쇰花ュ) �譴 순��鋼 匯듬 그 �甦맑 穢� 딘읒 力頌 (�寧ュ static���頌, � �寧ュ 꼬健) 穢�들ヴ. �健�읒밀ュ, 읫曳 �甦맑 뱃뭡梟健 윈�읒 穢�� � �ヴ; 뎬健� 뱃뭡鋼 __init__ 回��읒 穢�들ヴ.

�甦맑 뱃뭡�鋼 �甦맑-�影� ���庚韶 ��들ヴ (그↔鋼 �靴≠ MP3FileInfo읒밀 ���ュ 籃輛健ヴ), 그壽寧 그↔�鋼 �靈頌ュ ��≠ 껍レヴ.[4] �� 윈壽솥鋼 그↔�槪 순±� � �ヴ.

Example 3.19. Modifying class attributes

>>> class counter:
...     count = 0                     1
...     def __init__(self)
...         self.__class__.count += 1 2
...     
>>> counter
<class __main__.counter at 010EAECC>
>>> counter.count                     3
0
>>> c = counter()
>>> c.count                           4
1
>>> counter.count
1
>>> d = counter()                     5
>>> d.count
2
>>> c.count
2
>>> counter.count
2
1 countcounter �甦맑� �甦맑 뱃뭡健ヴ.
2 __class__ュ (匯� �甦맑�) 匯� �甦맑 �譴≠ ≠玲 蘆� 뱃뭡健ヴ. 그↔鋼 self況 그� �譴頌 �ュ �甦맑읒 �� �獵瑩健ヴ (健 ±�읒, counter �甦맑).
3 countュ �甦맑 뱃뭡健�頌, �靴≠ 그 �甦맑� �┱ �譴況 휸뭡�� �健�도, 그↔鋼 그 �甦맑읒 �� 曳閻 �獵況 ��윈 健�≠��ヴ.
4 그 �甦맑� �譴�寧況 휸뭡�� __init__ 回��況 繇��ュ뎬, 그↔鋼 그 �甦맑 뱃뭡, count1 梟� �≠맸�ヴ. 健↔鋼 그 �頌健 휸뭡들 �譴흣梟 껍レ�, 그 �甦맑 腱�읒도 윳�槪 藜�ヴ.
5 듬 纜櫻 �譴況 �寧 휸뭡�� � ヴ맸 그 �甦맑 뱃뭡, count況 �≠맸� ↔健ヴ. �┍∽ 그 �甦맑 뱃뭡槪 그 �甦맑잴 그� 匯� �譴�健 ×傑�ュ�況 ����.

3.9. �� ��

�쇰솥� 꿇��庚韶, �健�鋼 ヴ舡� ⌒��槪 ≠玲ヴ; �� ��, 그↔鋼 그�� 匯� 黎劍頌쇰� 繇�� � 꼬ヴ; �� �甦맑 回��, 그↔鋼 그�� �甦맑 黎劍頌쇰� 繇�� � 꼬ヴ; 그靴� �� 뱃뭡, 그↔鋼 그�� �甦맑 黎劍頌쇰� 閻깜� � 꼬ヴ. �쇰솥� 꿇���ュ ヴ花∽, �健�� ��, 回��, 玗鋼 뱃뭡�健 ��乾≠ 玗鋼 ×�乾≠ �ュ ↔鋼 ��劍頌 그� 健華읒 �� �穢들ヴ.

MP3FileInfo읒ュ, 듬 ⌒� 回��≠ �ヴ: __parse 그靴� __setitem__. �靴≠ 健藜 ��� 力잴  健, __setitem__�� 回��健ヴ; 숩�健��, 윈壽솥鋼 �甦맑 �譴읒 �� �� 깬珞槪 ���윈 그↔槪 。閻�劍頌 繇�� ↔健ヴ. 그壽寧 그↔鋼 ×�健ヴ, 그靴� 윈壽솥鋼 玲若 潔솥� 健傑≠ �ヴ� (���ュ fileinfo匯� 黎읒밀도) 그↔槪 曳閻�劍頌 繇�� � �槪 ↔健ヴ. 그峀�梟, __parseュ ��健ヴ, ���� 그↔鋼 그� 健華 맸虔쇰읒 듬 ⌒� 亂娛珞腱況 ≠�� ┐珞健ヴ.

Note
梟� �健�� ��, �甦맑 回��, 玗鋼 뱃뭡� 健華�健 듬 ⌒� 亂娛珞腱頌 맸虔�ヴ� (그壽寧 듬 ⌒� 亂娛 珞腱頌 怒寧� 꿩ュヴ), 그↔鋼 ��健ヴ; ヴ患 匯� ↔鋼 ×�健ヴ.
Note
�健�읒밀, (__setitem__�  鋼) 匯� �� 回�� 그靴� (__doc__�  鋼) 蘆� 뱃뭡�鋼 �影�乾 健華禮� �松況 �患ヴ: 그�鋼 匯듬 듬 ⌒� 亂娛珞腱頌 맸虔�� 怒祿ヴ. 윈壽솥 腱�梟� 回��잴 뱃뭡�槪 健塑�劍頌 健華禮� 譁�; 그↔鋼 健�읒 윈壽솥 (그靴� ヴ患 �┶�槪) 辱�맸� 흣健ヴ.
Note
�健�읒ュ (그� 腱�梟� �甦맑잴 腱믹 �甦맑읒梟 閻깜≠��) 숩繇 �甦맑 回���ュ ⌒�健 �� 꼬ヴ. �甦맑 回��ュ (그� 腱�� �甦맑읒梟 閻깜≠��) ��健�寧 玗鋼 (�뒵읒밀寧 閻깜≠��) ×�健ヴ.

Example 3.20. Trying to call a private method

>>> import fileinfo
>>> m = fileinfo.MP3FileInfo()
>>> m.__parse("/music/_singles/kairo.mp3") 1
Traceback (innermost last):
  File "<interactive input>", line 1, in ?
AttributeError: 'MP3FileInfo' instance has no attribute '__parse'
1 梟� 윈壽솥健 �� 回��況 繇���腱 �ヴ�, �健�鋼 그 回��ュ 梧��� 꿩ュヴ�, �。鋼 剛鰥들 잇�況 烙휸맸�ヴ. 蘿速 그↔鋼 梧��� 꿩ュヴ, 그壽寧 그↔鋼 ��健ヴ, 그甦밀 그 �甦맑 黎읒밀ュ 閻깜� � 꼬ヴ.[5]

� 居�꺌 � ↔

3.10. 잇�況 ヴ��

皇鋼 ∥譴-�� 꿇��庚韶, �健�읒ュ try...except �刷槪 �� 잇� 庚靴≠ �ヴ.

Note
�健�鋼 try...except槪 ���윈 잇�況 庚靴�ヴ 그靴� raise況 ���윈 잇�況 烙휸맸�ヴ. 腱力잴 C++ 鋼 try...catch 況 ���윈 잇�況 ヴ�ヴ, 그靴� throw況 ���윈 잇�況 烙휸맸�ヴ.

윈壽솥健 健藜 잇�읒 ��윈 匯� ↔槪 꿴ヴ�, 윈壽솥鋼 健 뭏�槪 �樓 � � �ヴ. 梟� 윈壽솥健 잇� 庚靴況 ≠�� �� 꿩鋼 �읽� 꿇�頌 �頌그甦��ュ뎬 鋸밍� 쟁ヴ�, 玗鋼 잇�況 ���� 꿩� �靈頌 꿇�況 ��� 쟁ヴ�, 健 뭏�鋼 ��尤 燁��ヴ.

�健�읒밀 잇�ュ �뒵읒寧 �ヴ; �靈�劍頌 �影 �健� �健�壽靴읒 �ュ 匯� 匯�鋼 그↔槪 ���ヴ, 그靴� �健� 그 腱譴ュ 皇鋼 ヴ患 橒±�읒밀 그↔�槪 烙휸맸� ↔健ヴ. 윈壽솥鋼 健藜 그↔�槪 �손�劍頌 健 甄槪 ��윈밀 숩껍 쟁ヴ.

健壽� ±�� 、、읒 ��윈, �靴ュ �健� IDE읒밀ュ 그� �藜�∽ ��梟 �� 들ヴ: 읒壽≠ 件�祿ヴ, 그 잇�ュ �悚들ヴ (윈壽솥� IDE읒 ��밀, 蘆쇰�劍頌 ��� 횰。� �頌 ±���ュ ��梟), 그靴� 그∽ ヴヴ. 健↔鋼 庚靴�� 꿩鋼 (unhandled) 잇��� 숄靴�ヴ; 그 잇�≠ 烙휸� ┐, 그↔槪 �맸�劍頌 \��� 庚靴�ュ �┱ ��도 꼬ヴ, 그甦밀 그 잇�ュ �健�읒 蘆�들 �셜 �胛頌 ヴ맸 쇰깖쇰깖 �壽 �� 둥껍장ヴ, �健�鋼 �。� 뒵�� 穢숩況 ��蘆� ��槪 ���ヴ. IDE읒밀, 그↔鋼 그峀∽ �件健 껍レヴ, 그壽寧 梟� 윈壽솥� �靈 �頌그少健 ���ュ 돛꿴읒 그塑 �右健 烙휸�ヴ�, 그 �譴 �頌그少鋼 급靈돛劍頌 怒寧∽ � ↔健ヴ.[6]

그峀�梟, 잇�ュ 잽�� �頌그少 潔둥健 ��밀ュ 꿴들ヴ. 잇�ュ, 烙휸��, 庚靴� (handled)� �ヴ. �┱ ┐읒ュ 잇�≠ �靈頌ュ 윈壽솥� ��읒 (梧��� 꿩ュ 순�읒 閻깜�ュ ↔�  鋼) �그≠ �� ┐珞健�도 �ヴ , 그壽寧 皇鋼 ±�읒, 잇�ュ 윈壽솥健 그↔읒 �� �寓 � � �ュ �┱ ↔健ヴ. 윈壽솥健 �件 �寧況 읽�腱 �ヴ�, 그↔健 梧��� 꿩槪�도 匯花�; 윈壽솥健 뎬健�샬健맑읒 읓���腱 �ヴ�, 그↔健 健�숄≠�� �도 ��寧, 玗鋼 그↔읒 閻깜�� 胛� 穢蟯� 숩꿴 �≠況 ≠�� �� 꿩槪 �도 �ヴ. 梟� 윈壽솥健 � 娛� ��≠ 잇�況 件劍��도 匯患ヴュ ↔槪 꿴ヴ�, 윈壽솥鋼 try...except �刷槪 ���윈 그 잇�況 庚靴�꺌梟 �ヴ.

Example 3.21. Opening a non-existent file

>>> fsock = open("/notthere", "r")      1
Traceback (innermost last):
  File "<interactive input>", line 1, in ?
IOError: [Errno 2] No such file or directory: '/notthere'
>>> try:
...     fsock = open("/notthere")       2
... except IOError:                     3
...     print "The file does not exist, exiting gracefully"
... print "This line will always print" 4
The file does not exist, exiting gracefully
This line will always print
1 蘆�들 open ��況 ����, �靴ュ �件槪 �悚�윈 읽�밀 居槪 � �ヴ ( open읒 ��윈ュ ヴ舡 뭏�읒밀 � 腱뭐尤 ヴ�). 그壽寧 그 �件槪 梧��� 꿩ュヴ, 그甦밀 健↔鋼 IOError 잇�況 烙휸맸�ヴ. �靴ュ IOError 잇�읒 ��윈 껍朗塑 �맸�乾 瑩↑쇰況 靈×�� 꿩뀜劍�頌, �健�鋼 �� 朗많件健 件�撚ュ�읒 �� �。� 뒵�� 穢숩況 �悚��ュ ��槪 ���ヴ.
2 �靴ュ � 鋼 그 �-梧� �件槪 읽淞� �悚�� �ヴ, 그壽寧 健纜읒ュ �靴ュ 그↔槪 try...except �刷꿴읒밀 ���� �ヴ.
3 open 回��≠ IOError 잇�況 烙휸맸��, �靴ュ 그↔읒 �� 影�≠ �� �ヴ. 'except IOError:' �乾鋼 그 잇�況 寧��ヴ 그靴� �靴 腱�梟� �� �刷槪 ���ヴ, 그↔鋼 健 ±�읒ュ �� �� �굔� 읒壽 回맸�況 �悚�ヴ.
4 잇�≠ 庚靴��梟 ��, 庚靴ュ try...except�刷 딘� 憬 纜櫻 �乾읒밀 穢��劍頌 玲�들ヴ. ��� ↔鋼 健 �乾鋼 ��, 잇�≠ 件� 寧� 껍レ�, �悚� ↔ 健�ュ ↔健ヴ. 梟� 윈壽솥健 �靈頌 notthere �� 숄靴�ュ �件槪 윈壽솥� 뒵消�靴읒 ≠�� �ヴ�, open槪 繇��ュ ↔鋼 뭡×� ↔健�, except 據鋼 朗맸� ↔健ヴ, 그靴� 健 �乾鋼 윈�尤 ��� ↔健ヴ.

잇�ュ �� 숩健�ュ 꿩ュヴ (�균, 윈壽솥健 그 잇�況 寧��� 꿩ュヴ�, 윈壽솥� �譴 �頌그少鋼 潔둥� ↔健ヴ) 그壽寧 그 �꿴槪 �淞�숩腱. 윈壽솥鋼 �-梧� �件읒 ��숄≠�� �件 ∥譴況 둥淞 숩蘆ュ �健 霓∫ュ≠? 윈壽솥鋼 �齬� �┍∽ �밀�� 그� 傑湧뭡槪 瑩↑�꺌梟 �ヴ, 그靴� 梟� 윈壽솥健 慷�ヴ�, 윈壽솥� �頌그少鋼 윈壽솥읒∽ 권健� 읒壽�槪 �뒵읒묽≠ 숩윈 娛↔健� 그 娛 胛읒밀 윈壽솥鋼 그 뱉맑頌 ヴ맸 偈�� ��≠꺌梟 � ↔健ヴ. 寧ュ 윈壽솥健 健塑↔槪 �숩뀜劍靴�� 蟯��ヴ; 그↔鋼 �藜�影� 珞靈≠ 껍レヴ. 잇�잴 �幢, 읒壽ュ 曳閻�劍頌 �幢 件�祿ヴ, 그靴� 윈壽솥鋼 그 珞靈況 ≠玲 뱉맑읒밀 �影�乾 籃�劍頌 그↔�槪 庚靴� � �ヴ.

�靈�乾 읒壽 獵��槪 庚靴�ュ ↔ �읒도 잇�況 胛� ヴ患 ��輛�健 皇健 �ヴ. �影�乾 �健� �健�壽靴� 件��乾 ��輛鋼 匯�槪 �建�淞� 맸도� 숩�, 그靴� 그↔健 虔돛�寧 꿱껍 숩ュ ↔健ヴ. 梧��� 꿩ュ 匯�槪 �建�� ImportError 잇�況 烙휸맸� ↔健ヴ. 윈壽솥鋼 健↔槪 健��윈 ��-맸읒 �ニ 匯�健 ��≠���읒 �競� 윈壽 �影� ��槪 穢�� � �ヴ, 玗鋼 윈壽 �誠�槪 �읏� � �ヴ (��읒밀ュ �誠�-�梧�乾 ��ュ 샥⌒� ヴ患 匯�頌 솥� �� ��。ヴ).

Example 3.22. Supporting platform-specific functionality

健 ��ュ, ��腱頌쇰� 뀁繇況 寓돗�� 胛� �� 匯�乾, getpass 匯�頌쇰� 傑甦�ヴ. 뀁繇況 寓돗�ュ ↔鋼 傑ボ맑, 姜도�, 그靴� 穫OS �誠�읒밀 밀頌 ヴ花∽ マ뭡들ヴ, 그壽寧 健 ��ュ 그壽� 匯� 量健況 �를優 �ヴ.

  # Bind the name getpass to the appropriate function
  try:
      import termios, TERMIOS                     1
  except ImportError:
      try:
          import msvcrt                           2
      except ImportError:
          try:
              from EasyDialogs import AskPassword 3
          except ImportError:
              getpass = default_getpass           4
          else:                                   5
              getpass = AskPassword
      else:
          getpass = win_getpass
  else:
      getpass = unix_getpass
1 termiosュ 傑ボ맑-�梧�乾 匯�頌밀 建悚 �藜陵읒 �� �-�影� 靈�況 靈×�ヴ. (그↔健 윈壽솥� 맸맑�읒 꼬�寧, 玗鋼 윈壽솥� 맸맑�健 그↔槪 �읏�� 꿩� ┐珞읒) 梟� 健 匯�健 ��≠��� 꿩ヴ�, 그 �建鋼 ���� �健�鋼 ImportError況 烙휸맸��, 그↔槪 �靴ュ 寧��ヴ.
2 霓ヴ, �靴ュ termios≠ 꼬ヴ, 그甦밀 msvcrt況 맸도� 숩腱, 그↔鋼 姜도�-�梧�乾 匯�頌밀 譁健�頌뱉�� ��� C++ ��맸。 밀�맑읒 �ュ 皇鋼 傑�� ���읒 �� API 況 靈×�影ヴ. 健 匯�健 ����, �健�鋼 ImportError읒壽況 烙휸맸� ↔健�, 그↔槪 �靴ュ 寧��ヴ.
3 그 憬 纜櫻 듬⌒≠ 虔돛�� 꿩劍�, �靴ュ EasyDialogs頌쇰� � ��況 �建�淞� �ヴ, 그↔鋼 穫 OS-�梧�乾 匯�頌밀 ヴ�� 暎�� �優麗맑況 �꾑�ュ ��況 靈×�ヴ. � ヴ맸, 梟� 健 匯�健 ����, �健�鋼 ImportError況 烙휸맸� ↔健�, 그↔槪 �靴ュ 寧��ヴ.
4 健壽� �甦�-�梧�乾 匯� 匯듬≠ ��≠��� 꿩ヴ (그↔鋼 ≠��ヴ, ���� �健�鋼 ヴ患 皇鋼 �誠�劍頌 健���倪� ┐珞健ヴ), 그甦밀 �靴ュ �셜 뀁繇 建悚 ��읒 �梧�꺌 � ��≠ �ヴ (그↔鋼 ヴ患 ≒ getpass 匯�읒 穢�들ヴ). �靴≠ 윈�읒밀 朗�槪 �ュ�況 ����: �靴ュ 그 �� default_getpass況 그 순� getpass읒 ���� �ヴ. 梟� 윈壽솥健 ×��乾 getpass 珞밀況 居� 셜ヴ�, ��읒밀 윈壽솥鋼 getpass 匯�健 getpass ��況 穢��ヴュ ↔槪 꿱 � �ヴ. 健↔健 力頌 그↔健 ���ュ 籃輛健ヴ: getpass況 윈壽솥� �誠�읒 �據� ��잴 徠舡劍頌�. 그壽� 윈壽솥健 getpass ��況 繇�� ┐, 윈壽솥鋼 �靈頌ュ 健 ��≠ 윈壽솥 �� 影��影 �誠�-�梧�乾 ��況 繇��� �ュ ↔健ヴ. 윈壽솥鋼 �┱ �誠�읒밀 윈壽솥� ��≠ ���� 꿱 ��도 ‘穢� ��도 꼬ヴ; �� getpass況 繇���, 그壽� 그↔鋼 �� 穢蟯� 虔꾑槪 ��� ↔健ヴ.
5 try...except �刷鋼, if 밀�珞庚韶, else 據槪 ≠� � �ヴ. 梟� If try �刷�� 돛꿴읒 껍朗塑 잇�도 烙휸�� 꿩ュヴ�, else 據健 健�읒 ��들ヴ. 健 ±�읒, 그↔健 ┥�ュ 力ュ from EasyDialogs import AskPassword≠ �建�� 虔돛��, 그甦밀 �靴ュ getpassAskPassword ��읒 徠� ��꺌 �ヴュ ↔槪 ┥�ヴ. ヴ患 try...except �刷� 、、鋼 �며� else 據槪 ≠葉밀 �靴≠ 虔돛�ュ import況 烙¨�� getpass況 그 �據� ��읒 徠�影ヴ.

� 居�꺌 � ↔

3.11. �件 ∥譴

�健�鋼 뒵맑�읒밀 �件槪 읽� 胛�, 蘆� �� open槪 ≠玲ヴ. open 鋼 �件 ∥譴況 �橒�ュ뎬, 그↔鋼 그 읽淞玲 �件읒 �� 穢숩況 寓돗�� 庚靴�� 胛� 回��잴 뱃뭡�槪 ≠玲ヴ.

Example 3.23. Opening a file

>>> f = open("/music/_singles/kairo.mp3", "rb") 1
>>> f                                           2
<open file '/music/_singles/kairo.mp3', mode 'rb' at 010E3988>
>>> f.mode                                      3
'rb'
>>> f.name                                      4
'/music/_singles/kairo.mp3'
1 open 回��ュ뭐 ⌒� �⌒순�況 �� � �ヴ: �件 健華, 匯�, 그靴� �� �⌒순�. 읫曳 憬 纜櫻� ↔, �件健華 梟健 ���健ヴ; ヴ患 듬 ⌒ュ 묽��健ヴ. 梟� �穢�� 꿩ュヴ�, 그 �件鋼 �맑� 匯�頌 居�況 胛� 읽禍ヴ. 윈�읒 �靴ュ 그 �件槪 健玲 匯�頌 居�況 胛� 읽� �ヴ. (print open.__doc__ 槪 �健��� 匯� ≠�� 匯�읒 �� �禾� 밈�槪 섰 � �ヴ.)
2 open ��ュ ∥譴況 �橒�ヴ (����ュ, 健↔鋼 윈壽솥槪 \��∽ ��ュ 꿩槪 ↔健ヴ). �件 ∥譴ュ �。� 傑�� 뱃뭡�槪 ≠玲ヴ.
3 � �件� mode 뱃뭡劍頌 윈壽솥鋼 그 �件健 �┱ 匯�頌 읽誦ュ�況 꿱 � �ヴ.
4 � �件� name 뱃뭡劍頌 윈壽솥鋼 그 �件 ∥譴≠ ⌒籃� �件� 健華槪 꿱 � �ヴ.

Example 3.24. Reading a file

>>> f
<open file '/music/_singles/kairo.mp3', mode 'rb' at 010E3988>
>>> f.tell()              1
0
>>> f.seek(-128, 2)       2
>>> f.tell()              3
7542909
>>> tagData = f.read(128) 4
>>> tagData
'TAGKAIRO****THE BEST GOA         ***DJ MARY-JANE***            Rave Mix                      2000http://mp3.com/DJMARYJANE     \037'
>>> f.tell()              5
7543037
1 �件 ∥譴ュ 腱�健 ⌒籃� 그 �件읒 �� ��穢숩況 傑��ヴ. � �件 ∥譴� tell 回��頌 윈壽솥鋼 그 읽淞玲 �件읒밀 윈壽솥� �� 胛�況 꿱 � �ヴ. �靴ュ 健 �件읒 ��윈 껍曳鋼 �┱ 庚靴도 ��� 꿩뀜劍�頌 , �� 胛�ュ 0健�, 그↔鋼 그 �件� 庚舡健ヴ.
2 �件 ∥譴� seek 回��ュ 그 ⌒籃들 �件읒밀 ヴ患 胛�頌 健돛�ヴ. 듬 纜櫻 �⌒순�ュ 憬 纜櫻 �⌒순�≠ 朗�槪 ┥�ュ�況 �穢�ヴ; 0 鋼 (그 �件� 庚舡劍頌쇰� 뭐�밀) 據��乾 胛�頌 健돛��ュ ┥健�, 1 鋼 (�� 胛�頌쇰� 뭐�밀) ���乾 胛�頌 健돛��ュ ┥健�, 그靴� 2 ュ 그 �件� 딘읒밀쇰� ���乾 胛�頌 健돛��ュ ┥健ヴ. �靴≠ 黔� �ュ MP3 ��ュ 그 �件� 딘읒 ���� �劍�頌, �靴ュ 2況 ���� 그 �件 ∥譴읒∽ 그 �件� 딘읒밀쇰� 128� 胛�頌 健돛�도刷 ���ヴ.
3 tell 回��ュ �件� �� 胛�≠ 健돛� ↔槪 蟯乾�ヴ.
4 read 回��ュ 그 ⌒籃들 �件頌쇰� �穢� ⌒�� 力健�況 居ュヴ 그靴� 居�玲 그 뎬健�況 ≠玲 珞腱읽槪 �橒�ヴ. 그 묽�� �⌒순�ュ 居�꺌� �� 力健� ⌒�況 �穢�ヴ. 梟� 껍朗塑 �⌒순�도 �穢�� 꿩ュヴ�, readュ 그 �件� 怒�� 居槪 ↔健ヴ. (�靴ュ 릴∽ 윈�읒밀 read()況 ��� � �ヴ, ���� �靴ュ 그 �件읒밀 穢蟯尤 �靴≠ �뒵읒 胛��ュ� 꿱� �劍� 그靴� ��鋼, �靴ュ 그 譁�恢 128力健�況 居� �ュ 燁健� ┐珞健ヴ.) 居�玲 뎬健�ュ tagData 순�읒 ��들ヴ, 그靴� �� 胛�ュ �譁寧 皇鋼 力健�≠ 居�ュ�읒 ��밀 ″�들ヴ.
5 tell 回��ュ �� 胛�≠ 健돛� ↔槪 蟯乾�ヴ. 윈壽솥健 �� �숩�, 128 力健�況 居鋼 �읒 그 胛�≠ 128梟� �≠�ヴュ ↔槪 윈壽솥鋼 숩∽ � ↔健ヴ.

Example 3.25. Closing a file

>>> f
<open file '/music/_singles/kairo.mp3', mode 'rb' at 010E3988>
>>> f.closed  1
0
>>> f.close() 2
>>> f
<closed file '/music/_singles/kairo.mp3', mode 'rb' at 010E3988>
>>> f.closed
1
>>> f.seek(0) 3
Traceback (innermost last):
  File "<interactive input>", line 1, in ?
ValueError: I/O operation on closed file
>>> f.tell()
Traceback (innermost last):
  File "<interactive input>", line 1, in ?
ValueError: I/O operation on closed file
>>> f.read()
Traceback (innermost last):
  File "<interactive input>", line 1, in ?
ValueError: I/O operation on closed file
>>> f.close() 4
1 �件 ∥譴� closed 뱃뭡鋼 그 ∥譴≠ �件槪 ⌒籃맸�� �ュ� 껍��況 ≠靴�ヴ. 健 ±�읒, 그 �件鋼 윈�尤 읽淞 �ヴ (closed0健ヴ). �件槪 윈ュ ↔鋼 맸맑� 腱읏槪 뱉匯�ヴ, 그靴� 그 �件� 匯�읒 ��밀, ヴ患 �頌그少�健 그↔�읒 閻깜�� 鰥� �도 �ヴ. 윈壽솥健 庚靴況 怒蘆腱 譁腱 ��� 횰靴 �件槪 �ュ ↔健 燁��ヴ.
2 �件槪 �� 胛�밀ュ, 그 �件 ∥譴� close 回��況 繇���. 健↔鋼 (梟� �ヴ�) 윈壽솥健 그 �件읒 ��윈 傑��� �ュ ����況 �靈�윈 ��, (梟� �ヴ�) 맸맑�健 껍曳 �靈頌 꾄� 꿩�밀 ��읒 껀 ↔�槪 ∠靈���윈 影ヴ, 그靴� 맸맑� 腱읏槪 ��影ヴ. closed 뱃뭡鋼 그 �件健 �� �ュ� 蟯乾�윈 影ヴ.
3 �� � �件健 ��ヴ� �밀 그 �件 ∥譴≠ 梧���況 丸�ヴュ ↔槪 ┥��ュ 꿩ュヴ. 순� f�胛況 諒� 陵 ┐�� 玗鋼 �虔꾑劍頌 �靈� ┐�� 梧�� ↔健ヴ. 그峀�梟, 그 �件健 ����梟 �� 읽淞玲 �件槪 庚靴�ュ 그 回���燁 �ニ ↔도 虔돛槪 丸� ↔健ヴ; 그� 匯듬ュ 잇�況 烙휸맸�ヴ.
4 �件健 健藜 ��玲 �件 ∥譴읒 �� close況 繇��� 잇�況 烙휸맸�� 꿩ュヴ; 그↔鋼 獵�尤 ���ヴ.

Example 3.26. File objects in MP3FileInfo

        try:                                1
            fsock = open(filename, "rb", 0) 2
            try:
                fsock.seek(-128, 2)         3
                tagdata = fsock.read(128)   4
            finally:                        5
                fsock.close()
            .
            .
            .
        except IOError:                     6
            pass                           
1 �件槪 ⌒籃�� 居ュ ↔鋼 胛��� ┐珞읒 잇�況 烙휸맸� �도 �ヴ, 健壽� 匯� ��ュ try...except �刷읒 ��들ヴ. (윈壽솥, �影�乾 �윈꾄�, 穢恍 ���� 꿩맷レ�? 윈�읒밀 윈壽솥鋼 그↔읒 �� \��� 맸虔�ヴ.)
2 open ��ュ IOError況 烙휸맸� �도 �ヴ. (그 �件健 梧��� 꿩槪 �도 �ヴ.)
3 seek 回��ュ IOError況 烙휸맸� �도 �ヴ. (그 �件健 128力健�숩ヴ 虔槪 �도 �ヴ.)
4 read 回��ュ IOError況 烙휸맸� �도 �ヴ. (그 뒵맑�≠ ��뭏�況 ≠�� �タ≠, 玗鋼 그↔健 弄��� ��健�읒 �� 그 弄���≠ 虔돛�� 꿩槪 �도 �ヴ.)
5 健↔鋼 �灑ヴ: try...finally �刷. 그 �件健 open ��읒 ��윈 뭡×�劍頌 읽靴�, 잇�≠ seek 玗鋼 read回��읒 ��밀 烙휸� ��도, �靴ュ 蟯��∽ 그↔健 ��ュ� 蟯乾��況 읏�ヴ. 그↔健 力頌 try...finally �刷健 ���ュ �도健ヴ: try �刷 꿴읒밀 �┱ ↔健 잇�況 烙휸맸�ヴ� � ��도, finally �刷� ��ュ �� ��� ↔健ヴ. 朗많件健 件�祿ヴ� ���도, 그↔鋼 “怒��” ���ュ ���� 휸、��.
6 譁�蘆, �靴ュ IOError 잇�況 庚靴�ヴ. 健↔鋼 open, seek, 玗鋼 read況 繇��윈 烙휸들 IOError 잇�件 � �ヴ . 윈�읒밀, �靴ュ �靈頌 �濾�� 꿩ュヴ, ���� �靴≠ �淞� �ュ 匯� ↔鋼 그↔槪 獵�尤 朗맸�� �뱃 玲��ュ ↔健� ┐珞健ヴ. (����, passュ �健�� 밀�珞劍頌 껍朗↔도 �� 꿩ュヴ.) 그↔鋼 잽��∽ �輛�ヴ; 잇�況 “庚靴�ュ ↔”鋼 �맸�劍頌 껍朗↔도 �� 꿩ュヴュ ↔槪 ┥� � �ヴ. 그↔鋼 윈�尤 庚靴들 ↔劍頌 。���, 그靴� 庚靴ュ try...except �刷 딘� 力頌 그 ヴ舡 娛읒밀 穢��劍頌 �뱃 玲�� ↔健ヴ.

Further reading

3.12. for 耘둥健

�쇰솥� ヴ患 꿇��庚韶, �健�읒ュ for 耘둥健≠ �ヴ. ���� 윈壽솥健 그↔�槪 숩� 鰥�タ 傑件� 健傑ュ �健�健 ヴ患 皇鋼 件�읒 ���윈 윈壽솥鋼 그峀∽ 腱� 그↔�健 ���� 꿩� ┐珞健ヴ.

�쇰솥� ヴ患 꿇��읒ュ �健��  鋼 ∠悚� 靴맑� 뎬健��健 꼬ヴ, 그甦밀 윈壽솥鋼 � 皇鋼 �虔꾑槪 �꺌�ヴ. 庚舡, 譁�恢, 그靴� �』 槪 �穢�윈 穢�� �胛況 穢���寧 玗鋼 ヴ患 �손�乾 ⌒譴�槪 穢��ヴ. 그壽寧 �健�읒밀ュ, for 耘둥健≠ 靴맑�況 �손� ��,  鋼 籃�劍頌 靴맑� 纜을健 虔돛�ヴ.

Example 3.27. Introducing the for loop

>>> li = ['a', 'b', 'e']
>>> for s in li:         1
...     print s          2
a
b
e
>>> print "\n".join(li)  3
a
b
e
1 for 耘둥健況 胛� 깬珞鋼 靴맑� 纜을� �며�ヴ. liュ 靴맑�健ヴ, 그靴� sュ, 憬 纜櫻 �뱉頌쇰� 맸虔�윈, 、 �뱉� 』槪 量松�頌 �� ↔健ヴ.
2 if 밀�珞 玗鋼 ヴ患 匯� �윈꾄� �刷庚韶, for 耘둥健ュ 腱�꿴읒 �─� ⌒�� �乾도 ≠� � �ヴ.
3 健↔健 力頌 윈壽솥健 ���� for 耘둥健況 숩� 鰥�タ 健傑健ヴ: �靴ュ 껍曳��ュ 그↔健 ���� 꿩ヴ. 윈壽솥健 �靈頌 읏�ュ ↔健 join 玗鋼 靴맑� 纜을乾 ±�읒 ヴ患 꿇�읒밀ュ �譁寧 皇鋼 for 耘둥健況 윈壽솥健 ���ュ�況 숩� �┸ヴ.

Example 3.28. Iterating through a dictionary

>>> for k, v in os.environ.items(): 1 2
...     print "%s=%s" % (k, v)
USERPROFILE=C:\Documents and Settings\mpilgrim
OS=Windows_NT
COMPUTERNAME=MPILGRIM
USERNAME=mpilgrim

[...snip...]
>>> print "\n".join(["%s=%s" % (k, v) for k, v in os.environ.items()]) 3
USERPROFILE=C:\Documents and Settings\mpilgrim
OS=Windows_NT
COMPUTERNAME=MPILGRIM
USERNAME=mpilgrim

[...snip...]
1 os.environュ 윈壽솥� 맸맑�읒 ��윈 穢�들 橒± 순��槪 �� �ュ ��健ヴ. 姜도�읒밀, 健↔鋼 도맑頌쇰� 閻깜� � �ュ 맸맑� 순�잴 ��腱 순�健ヴ. 傑ボ맑읒밀, 그↔�鋼 윈壽솥� 릇� 맸虔 맑�潢�읒 숩蘆�玲 순��健ヴ. 穫 OS읒밀, 橒±순�읒 �� ⌒�健 꼬ヴ, 그甦밀 健 ��鋼 �� �ヴ.
2 os.environ.items()鋼 ��� 靴맑�: [(key1, value1), (key2, value2), ...]況 �橒�ヴ. for 耘둥健ュ 健 靴맑�況 �손�ヴ. 憬 纜櫻 耘�읒밀, 그↔鋼 key1k읒 ���� 그靴� value1v읒 ���ヴ, 그甦밀 k = USERPROFILE 健� v = C:\Documents and Settings\mpilgrim健ヴ. 듬 纜� 耘�읒밀, k ュ 듬纜櫻 �, OS況 寓돗��, 그靴� vュ 그읒 �皆�ュ 』, Windows_NT況 寓돗�ヴ.
3 ヴ燁-순� ��靴맑� 纜을劍頌, 윈壽솥鋼 그 �譴 for 耘둥健況 � �⌒� 밀�珞劍頌 ��� � �ヴ. 윈壽솥健 �靈 ��읒밀 健峀∽ 玲若頌 �ュ�� 윈쇰ュ ⌒乾�乾 �� 맑�件� 珞靈健ヴ; 寧ュ 그↔槪 霓껍�ヴ ���� 그↔鋼 �靴≠ �� �ュ ↔健 ��槪 靴맑�읒 羊槪 禮�, 그靴�寧밀 그 靴맑�況 � ⌒� 珞腱읽頌 ���ュ ↔健�ュ ↔槪 �蟯�∽ �윈 �� ┐珞健ヴ. ヴ患 �頌그甦蛔�鋼 健↔槪 for 耘둥健頌 虔뭡��況 � 霓껍�ヴ. ��� ↔鋼 �ニ ±�읒寧 그 �悚槪  ヴュ ↔健ヴ, 그峀�梟 健 ��健 �。 � �患뎬, ���� 皇鋼 밀�珞 ��읒 � �⌒� print 밀�珞梟 �� ┐珞健ヴ.

Example 3.29. for loop in MP3FileInfo

    tagDataMap = {"title"   : (  3,  33, stripnulls),
                  "artist"  : ( 33,  63, stripnulls),
                  "album"   : ( 63,  93, stripnulls),
                  "year"    : ( 93,  97, stripnulls),
                  "comment" : ( 97, 126, stripnulls),
                  "genre"   : (127, 128, ord)} 1
    .
    .
    .
            if tagdata[:3] == "TAG":
                for tag, (start, end, parseFunc) in self.tagDataMap.items(): 2
                    self[tag] = parseFunc(tagdata[start:end])                3
1 tagDataMap�甦맑 뱃뭡劍頌밀 MP3 �件읒밀 �靴≠ 黔� �ュ �그�槪 穢��ヴ. �그�鋼 �穢-굶健 ��頌 ���� �ヴ; �靴≠ 그 �件� 譁�恢 128 力健�況 居劍�, 그 燁� 3읒밀 32力健�ュ �� �甦 �健�健�, 33-62 鋼 �� 껍�맑� 健華健�, 63-92 鋼 끄� 健華, �� 健ヴ. ��� ↔鋼 tagDataMap鋼 ��頌 健��玲 ��健�, 그靴� 、 ��鋼 듬⌒� 穢�잴 �� �獵瑩槪 ���� �ヴュ ↔健ヴ.
2 健↔鋼 손��∽ 숩乾ヴ, 그壽寧 그峀� 꿩ヴ. for 순��� 깬獵ュ items健 �橒� 靴맑�읒 ��들 �뱉�� 깬獵잴 件��ヴ. ����, items(key, value)� ��乾 ��� 靴맑�況 �橒�ヴ. 그 靴맑�� 憬 纜櫻 �뱉ュ ("title", (3, 33, <function stripnulls>))健ヴ, 그甦밀 憬 纜櫻 耘둥健읒밀, tag"title"槪, start3槪, end33槪, 그靴� parseFuncstripnulls��況 寓돗�ヴ.
3 �靴ュ 健靈 � ⌒� MP3 �그況 胛� 匯� �⌒순��槪 偈��윔劍�頌, 그 �그 뎬健�況 ���ュ ↔鋼 릴ヴ. �靴ュ tagdatastart頌쇰� end�� �⌒� 健 �그況 胛� �靈� 뎬健�況 寓돗��, parseFunc槪 繇��윈 그 뎬健�況 �-庚靴�ヴ, 그靴� 健↔槪 ��-�� self읒 �ュ � tag� 』劍頌 ���ヴ. tagDataMap읒 �ュ 匯� �뱉�槪 �손� �읒, self ュ 匯� �그�槪 胛� 』槪 ≠玲ヴ, 그靴� 윈壽솥鋼 그↔健 �┍∽ 숩件�況 健��ヴ.

3.13. 匯�읒 ��윈 � 腱뭐尤

ヴ患 匯� ↔� 譁�≠�頌, �健�읒밀 匯�鋼 ∥譴健ヴ. �建��, 윈壽솥鋼 �을 �� sys.modules況 ��윈 匯�읒 �� �獵瑩槪 寓돗� � �ヴ.

Example 3.30. Introducing sys.modules

>>> import sys                          1
>>> print '\n'.join(sys.modules.keys()) 2
win32api
os.path
os
exceptions
__main__
ntpath
nt
sys
__builtin__
site
signal
UserDict
stat
1 sys 匯�鋼 윈壽솥健 ���� �ュ �健�� ��� (sys.version 玗鋼 sys.version_info)  鋼, 맸맑�-�影� 穢숩況 숩傑�ヴ 그靴� �쇰華� �� �� �健잴 (sys.getrecursionlimit()� sys.setrecursionlimit())  鋼 맸맑�-�影� 묽���槪 숩傑�ヴ.
2 sys.modulesュ �健�健 맸虔들 健�頌 �建들 匯� 匯�槪 �� �ュ ��健ヴ; 그 �ュ 匯� 健華健ヴ, 그 』鋼 匯� ∥譴健ヴ. 健↔鋼 윈壽솥�(your) �頌그少健 �建� 그 匯�� 健�巾槪 ����. �健�鋼 맸虔� ┐ �┱ 匯��槪 藜靴 居� �乾ヴ, 그靴� 윈壽솥健 �健� IDE읒 �ヴ�, sys.modules鋼 IDE꿴읒밀 윈壽솥健 ��� 匯� �頌그少�健 �建�, 匯� 匯�槪 �� �ヴ.

Example 3.31. Using sys.modules

>>> import fileinfo         1
>>> print '\n'.join(sys.modules.keys())
win32api
os.path
os
fileinfo
exceptions
__main__
ntpath
nt
sys
__builtin__
site
signal
UserDict
stat
>>> fileinfo
<module 'fileinfo' from 'fileinfo.pyc'>
>>> sys.modules["fileinfo"] 2
<module 'fileinfo' from 'fileinfo.pyc'>
1 �頌� 匯�健 �建��, 그�鋼 sys.modules읒 偈≠들ヴ. 健↔健 力頌  鋼 匯�槪 듬 纜 �建�� ��尤 �患 健傑況 밈�� 影ヴ: �健�鋼 健藜 居� �윈倪� 그 匯�槪 sys.modules읒 ���ヴ, 그甦밀 듬 纜櫻 �建�ュ ↔鋼 �뮈尤 ��槪 ���ュ ↔件 흣健ヴ.
2 健�읒-�建들 �─� 匯�� 健華健�도 (珞腱읽頌밀) ��玲ヴ�, 윈壽솥鋼 sys.modules ��槪 ��윈 그 匯� 腱譴읒 �� �獵瑩槪 寓돗� � �ヴ.

Example 3.32. The __module__ class attribute

>>> from fileinfo import MP3FileInfo
>>> MP3FileInfo.__module__              1
'fileinfo'
>>> sys.modules[MP3FileInfo.__module__] 2
<module 'fileinfo' from 'fileinfo.pyc'>
1 匯� �健� �甦맑ュ 蘆� �甦맑 뱃뭡 __module__槪 ≠玲ヴ, 그↔鋼 그 �甦맑≠ 穢�들 匯�� 健華健ヴ.
2 健↔槪 sys.modules ��� ���劍頌�, 윈壽솥鋼 �甦맑≠ 穢�들 그 匯�읒 �� �獵瑩槪 寓돗� � �ヴ.

Example 3.33. sys.modules in fileinfo.py

    def getFileInfoClass(filename, module=sys.modules[FileInfo.__module__]):       1
        "get file info class from filename extension"
        subclass = "%sFileInfo" % os.path.splitext(filename)[1].upper()[1:]        2
        return hasattr(module, subclass) and getattr(module, subclass) or FileInfo 3
1 健↔鋼 듬 ⌒� 乾�況 ≠�ュ ��健ヴ; filename鋼 ���健ヴ, 그壽寧 module묽��健ヴ 그靴� FileInfo �甦맑況 �� �ュ 그 匯�健 �셜』健 들ヴ. 健↔鋼 �湧喀�劍頌 숩乾ヴ, ���� 윈壽솥鋼 �健�健 그 ��≠ 繇�� ┐譁ヴ sys.modules ���槪 �≠� ↔健�� 잇��� ┐珞健ヴ. ��鋼, �健�鋼 �셜 ���槪 그 匯�健 �建� ┐ 庚舡劍頌, �纜梟 �≠�ヴ. �靴≠ 寧燁읒 숩∽ ��健, �靴ュ 健 ��況 module 乾�頌 繇��� 꿩ュヴ, 그甦밀 module鋼 ��-�影 ��頌 ��槪 �ヴ.
2 �靴ュ os匯�읒 ヴ健�� ��。 健�읒, 健 �乾槪 �健 읓깬� 섰 ↔健ヴ. ��劍頌밀ュ, subclassMP3FileInfo庚韶, � �甦맑� 健華劍頌 怒祿ヴ� 礪舡槪 ≠葉�.
3 윈壽솥鋼 健藜 getattr읒 ��윈 꿱� �ュ뎬, 그↔鋼 � ∥譴읒 �� �獵瑩槪 健華劍頌 寓돗�ヴ. hasattrュ 숩獵�乾 ��頌밀 � ∥譴≠ �샥� 뱃뭡槪 ≠�� �ュ� 瑩↑�ヴ; 健 ±�읒ュ, �寧� 匯�健 �샥� �甦맑況 ≠�� �ュ�況 瑩↑�ヴ (그峀�梟 그↔鋼 getattr 庚韶, �┱ ∥譴 그靴� �┱ 뱃뭡읒도 虔돛�ヴ). 윳�頌 健꺌� ��, 健 �� �乾鋼 “ 梟� 健 匯�健 subclass읒 ��윈 ��들 �甦맑況 ≠�� �ヴ� 그壽� 그↔槪 �橒��, 그峀� 꿩劍� 그 �셜 �甦맑 FileInfo況 �橒�� ”ュ ┥健ヴ.

� 居�꺌 � ↔

3.14. os 匯�

os 匯�鋼 皇鋼 傑�� ��況 ≠�� ��밀 �件� 庚靴�穢�槪 ヴ�ヴ, 그靴� os.path읒ュ �件� 뒵消�靴 ±頌況 胛� ���健 �ヴ.

Example 3.34. Constructing pathnames

>>> import os
>>> os.path.join("c:\\music\\ap\\", "mahadeva.mp3") 1 2
'c:\\music\\ap\\mahadeva.mp3'
>>> os.path.join("c:\\music\\ap", "mahadeva.mp3")   3
'c:\\music\\ap\\mahadeva.mp3'
>>> os.path.expanduser("~")                         4
'c:\\Documents and Settings\\mpilgrim\\My Documents'
>>> os.path.join(os.path.expanduser("~"), "Python") 5
'c:\\Documents and Settings\\mpilgrim\\My Documents\\Python'
1 os.pathュ �寧� 匯�읒 �� �獵瑩健ヴ; �ニ 匯�健� �ュ ↔鋼 윈壽솥健 �┱ �誠�읒밀 ���� �ニ�읒 マ淞 �ヴ. getpassgetpass況 �誠�-�梧� ��읒 밈穢�劍頌� �誠��健� 量健況 �를優 �ュ ↔� 譁�≠�頌 �  健, ospath況 �誠�-�梧� ��읒 밈穢�劍頌� �誠��健� 量健況 �를優 �ヴ.
2 os.pathjoin ��ュ �寧 健�� 쇰솥� ±頌健華劍頌쇰� ±頌健華槪 깬뭡�ヴ. 健塑 。�� ±�읒ュ, 그↔鋼 �뮈尤 珞腱읽槪 읓��ヴ. (��� ↔鋼 姜도�읒밀 ±頌健華槪 ヴ�ュ ↔鋼 纜�灑ヴュ ↔健ヴ ���� �만甦맞 珞腱況 ��꺌梟 �� ┐珞健ヴ.)
3 健塑 �。 손�� 穢도읒ュ, join健 윈솥� �만甦맞況, �件 健華읒 ��� �읒 그 ±頌健華읒 돝숏件 ↔健ヴ. 蘆≠ 健↔槪 烙¨�槪 ┐ 寧ュ 樓朗 �획ュ뎬, ���� addSlashIfNecessary≠ ��, �頌� 꿇�頌 寧� 도깬�槪 梟� ┐ 虔뭡�꺌梟 �タ 그 力숩 鋼 ���燁� �寧윔� ┐珞健ヴ . �健�읒밀ュ 健塑 力숩 鋼 腱剛� ���槪 ���� 譁�; ��� �┶�鋼 健藜 윈壽솥槪 胛�윈 그↔읒 �� ��況 ��健� �ヴ.
4 expanduserュ �� ��腱� 遼 뒵消�靴況 寧�蘆� 胛�윈 ~況 ���ュ ±頌健華槪 蟯�� ↔健ヴ. 健↔鋼 姜도�, 傑ボ맑, 그靴� 穫 OS X 庚韶, ��腱≠ 遼 뒵消�靴況 ≠�ュ �─� �誠�읒도 虔돛�ヴ; 그↔鋼 Mac OS읒ュ 윳�槪 藜�� 꿩ュヴ.
5 健壽� ��ボ槪 ���윈, 윈壽솥鋼 릴∽ 윈壽솥� 遼 뒵消�靴 껍甦읒 �件� 뒵消�靴況 胛� ±頌健華槪 깬�� � �ヴ.

Example 3.35. Splitting pathnames

>>> os.path.split("c:\\music\\ap\\mahadeva.mp3")                        1
('c:\\music\\ap', 'mahadeva.mp3')
>>> (filepath, filename) = os.path.split("c:\\music\\ap\\mahadeva.mp3") 2
>>> filepath                                                            3
'c:\\music\\ap'
>>> filename                                                            4
'mahadeva.mp3'
>>> (shortname, extension) = os.path.splitext(filename)                 5
>>> shortname
'mahadeva'
>>> extension
'.mp3'
1 split ��ュ 잽�� ±頌健華槪 �⌒밀 그 ±頌잴 �件健華槪 ≠玲 ��槪 �橒�ヴ. 윈壽솥鋼 ヴ燁-순� ��槪 ���윈 �寧� ��頌쇰� 윈壽⌒� 』槪 �橒� � �ヴ� 윈壽솥읒∽ 蘆≠ 恍� ┐況 ���ュ≠? 腱, split鋼 그壽� ��健ヴ.
2 �靴ュ split ��≠ �橒� 』槪 듬 ⌒� 순�況 ≠玲 ��읒 ���ヴ. 、 순�ュ �橒들 ��� 그 �皆�ュ �뱉� 』槪 閻��ヴ.
3 憬 纜櫻 순�, filepathsplit劍頌쇰� �橒들 ��� 憬 纜櫻 �뱉� 』, �件 ±頌況 良ュヴ.
4 듬 纜櫻 순�, filenamesplit劍頌쇰� �橒들 ��� 듬 纜櫻 �뱉� 』, �件健華槪 良ュヴ.
5 os.pathュ �� splitext�ュ ��況 ≠�ュ뎬, 그↔鋼 �件健華槪 �⌒� 그 �件健華� 蟯�腱況 ���ュ ��槪 �橒�ヴ. �靴ュ  鋼 ��ボ槪 ���윈 그↔� 、、槪 샥⌒� 순��읒 ���ヴ.

Example 3.36. Listing directories

>>> os.listdir("c:\\music\\_singles\\")                                          1
['a_time_long_forgotten_con.mp3', 'hellraiser.mp3', 'kairo.mp3',
'long_way_home1.mp3', 'sidewinder.mp3', 'spinning.mp3']
>>> dirname = "c:\\"
>>> os.listdir(dirname)                                                          2
['AUTOEXEC.BAT', 'boot.ini', 'CONFIG.SYS', 'cygwin', 'docbook',
'Documents and Settings', 'Incoming', 'Inetpub', 'IO.SYS', 'MSDOS.SYS', 'Music',
'NTDETECT.COM', 'ntldr', 'pagefile.sys', 'Program Files', 'Python20', 'RECYCLER',
'System Volume Information', 'TEMP', 'WINNT']
>>> [f for f in os.listdir(dirname) if os.path.isfile(os.path.join(dirname, f))] 3
['AUTOEXEC.BAT', 'boot.ini', 'CONFIG.SYS', 'IO.SYS', 'MSDOS.SYS',
'NTDETECT.COM', 'ntldr', 'pagefile.sys']
>>> [f for f in os.listdir(dirname) if os.path.isdir(os.path.join(dirname, f))]  4
['cygwin', 'docbook', 'Documents and Settings', 'Incoming',
'Inetpub', 'Music', 'Program Files', 'Python20', 'RECYCLER',
'System Volume Information', 'TEMP', 'WINNT']
1 listdir ��ュ ±頌健華槪 ��윈 그 뒵消�靴� 蘆�槪 ���ュ 靴맑�況 �橒�ヴ.
2 listdir鋼 �┱↔健 �┱ �� ≠靴�� 꿩�, �件� �� 匯듬況 �橒�ヴ.
3 윈壽솥鋼 靴맑� 윈���os.path匯�� isfile ��況 ���윈 그 �件�槪 ��頌쇰� 솥靴� � �ヴ. isfile鋼 ±頌健華槪 ��윈 그 ±頌≠ �件槪 ≠花�� 1槪, 그峀� 꿩劍� 0槪 �橒�ヴ. �靴ュ 윈�읒밀 os.path.join槪 ���윈 잽�� ±頌健華槪 蟯乾�ヴ, 그壽寧 isfile鋼 �� �� 虔꾑 뒵消�靴읒 ���乾, 쇰솥� ±頌잴도 虔돛�ヴ. 윈壽솥鋼 os.path.getcwd()槪 ���윈 ��� 虔꾑 뒵消�靴況 寓돗� � �ヴ.
4 os.pathュ �� isdir ��況 ≠�ュ뎬 梟� 그 ±頌≠ 뒵消�靴況 ≠靴�� 1槪 그峀� 꿩劍� 0槪 �橒�ヴ. 윈壽솥鋼 健↔槪 ���윈 �寧� 뒵消�靴꿴읒 �ュ �쇰뒵消�靴� 靴맑�況 �槪 � �ヴ.

Example 3.37. Listing directories in fileinfo.py

def listDirectory(directory, fileExtList):
    "get list of file info objects for files of particular extensions"
    fileExtList = [ext.upper() for ext in fileExtList]
    fileList = [os.path.join(directory, f) for f in os.listdir(directory) \
                if os.path.splitext(f)[1].upper() in fileExtList]                 

健 譁�恢 �� �乾鋼 �靴≠ ���� os匯�읒 ��윈 ��장 �� 匯� ↔�槪 ���� �ヴ.

  1. os.listdir(directory)뒵消�靴(directory)꿴읒 �ュ ��잴 �件 匯듬況 �鋼 靴맑�況 �橒�ヴ.
  2. f頌 그 靴맑�況 耘둥健 ��밀, �靴ュ os.path.splitext(f)槪 ���윈 、、� �件健華槪 健華� 蟯�腱頌 솥靴�ヴ.
  3. �靴ュ 蟯�腱況 ��윈, 그↔槪 �珞腱頌 ∠靈순橒�� (os.path.splitext(f)[1].upper()), 그靴� �靴≠ ��槪 ≠玲 �件 蟯�腱� �刷읒 그↔健 �ュ�況 ��셜ヴ (fileExtList, 그↔鋼 listDirectory��읒 �弄�玲ヴ) (��� ↔鋼 fileExtList잴 、 �件� 蟯�腱況 �珞腱頌 순橒�� 健↔鋼 姜도�잴  鋼 �읽� �誠�읒밀 �瑩꼬健 虔돛� � �ヴ. 姜도�ュ mahadeva.mp3mahadeva.MP3 況  鋼 ↔劍頌 휸、�ヴ.)
  4. �靴≠ ��槪 ≠玲 、 �件읒 ��윈, �靴ュ os.path.join(directory, f)況 ���윈 그 �件� �譴 ±頌況 깬뭡�ヴ, 그靴� �譴 ±頌健華槪 �鋼 靴맑�況 �橒�ヴ.
Note
≠��ヴ� 꿇靈寧, 윈壽솥鋼 osos.path읒 �ュ ���槪 �件, 뒵消�靴, 그靴� ±頌 庚靴읒 ���꺌 �ヴ. 健壽� 匯��鋼 �誠�-�梧� 匯�槪 胛� ��腱健ヴ, 그甦밀 os.path.split잴  鋼 ���鋼 傑ボ맑, 姜도�, 穫 OS, 그靴� �읏�ュ ヴ患 匯� �健� �誠�읒밀 虔돛�ヴ.

� 居�꺌 � ↔

3.15. 匯듬 �寧頌 ���

� ヴ맸, 匯� 도藜�ュ 靈腱靴읒 �윔ヴ. �靴ュ 、 �乾� ��≠ �┍∽ 虔돛�ュ� 숩뀜ヴ. 健靈 딘頌 둥껍≠ �┍∽ 그 匯� ↔�健 會偈� �ュ� ��숩腱.

Example 3.38. listDirectory

def listDirectory(directory, fileExtList):                                         1
    "get list of file info objects for files of particular extensions"
    fileExtList = [ext.upper() for ext in fileExtList]
    fileList = [os.path.join(directory, f) for f in os.listdir(directory) \
                if os.path.splitext(f)[1].upper() in fileExtList]                  2
    def getFileInfoClass(filename, module=sys.modules[FileInfo.__module__]):       3
        "get file info class from filename extension"
        subclass = "%sFileInfo" % os.path.splitext(filename)[1].upper()[1:]        4
        return hasattr(module, subclass) and getattr(module, subclass) or FileInfo 5
    return [getFileInfoClass(f)(f) for f in fileList]                              6
1 listDirectoryュ 健 �譴 匯�읒밀 ≠� �悚�乾 쇰솥健ヴ. 그↔鋼 (寧� ±�읒 c:\music\_singles\잴  鋼) �寧� 뒵消�靴잴 (['.mp3']잴  鋼) �藜�ュ �件 蟯�腱�槪 �鋼 靴맑�況 ��ヴ, 그靴� 그↔鋼 ��庚韶 �돛�ュ �甦맑 �譴�槪 �鋼 靴맑�況 �橒�ヴ. 그 ��읒ュ 그 뒵消�靴읒 �ュ �藜 �ュ �件읒 �� 、、� 回�穢숩�健 �� �ヴ. 그靴� 그↔鋼 �� �娛� ��� ��頌 그峀∽ �蘆� �ヴ.
2 �靴≠ 健� 뭏�읒밀 셜 力잴  健, 健 �� �乾鋼 directory읒 �ュ 匯� �件�읒 �� �譴 ±頌況 �鋼 靴맑�況 寓돗�ヴ. 그 뒵消�靴ュ (fileExtList읒 ��밀 �穢들) �藜頌� �件 蟯�腱況 ≠�� �ヴ.
3 잇�-�귑 �맑� �頌그甦蛔�鋼 껍譁도 健↔�읒 鋸밍� ↔健ヴ, 그壽寧 �쇰솥� �┶�鋼, 蘆≠ �健�鋼 蘆�들 �� (nested functions)況 �읏�ヴ� 恍�� 寧況 宖�レ �ヴ 셜ヴ -- 珞腱 그�頌, ��꿴� ��. 그 蘆�들 �� getFileInfoClassュ 읫曳 그↔健 穢�들 ��, listDirectory頌쇰�梟 繇�� � �ヴ. ヴ患 �┱ ��잴 譁�≠�頌, 윈壽솥鋼 乾��健맑 묽꿇健寧 玗鋼 ���ュ �┱ ↔도 ��≠ 꼬ヴ; �� 그 ��況 穢��� 그↔槪 ��(虔뭡)��.
4 健靈 윈壽솥鋼 os 匯�槪 셜 力 �劍�頌, 健 �乾鋼 �� 健�≠ 剛 ��꺌梟 �ヴ. 그↔鋼 그 �件� 蟯�腱況 寓돗�ヴ (os.path.splitext(filename)[1]), 그↔槪 �솥腱頌 순橒�ヴ (.upper()), 瑩槪 �� 蘆 �禍ヴ ([1:]), 그靴� 그↔劍頌쇰� 珞腱읽 ��優頌 �甦맑 健華槪 깬뭡�ヴ. 그甦밀 c:\music\ap\mahadeva.mp3.mp3≠ �� � .MP3≠ �� � MP3≠ �� ヴ맸 MP3FileInfo≠ 들ヴ.
5 健 �件槪 庚靴� 庚靴 �甦맑� 健華槪 깬뭡��밀, �靴ュ 그 庚靴 �甦맑≠ �靈頌 健 匯�읒 梧��ュ� 瑩↑�ヴ. 梧��ヴ�, �靴ュ 그 �甦맑況 �橒��, 그峀� 꿩劍� �靴ュ �셜 �甦맑 FileInfo況 �橒�ヴ. 健↔鋼 ��尤 燁�� 瑩健ヴ: 健 ��ュ �甦맑況 �橒�ヴ. � �甦맑� �譴≠ 껍レ�, �甦맑 그 腱譴況 �橒�ヴ.
6 �靴� “�藜 �ュ �件” �刷(fileList)읒 �ュ 、 �件읒 ��윈, �靴ュ 그 �件健華 (f)頌 getFileInfoClass況 繇��ヴ getFileInfoClass(f)況 繇��� �甦맑況 �橒�ヴ; �靴ュ 穢蟯�∽ �┱ �甦맑乾� 匯患ヴ, 그壽寧 ���� 꿩ュヴ. 그靴�ュ �靴ュ 健 �甦맑� (그↔健 朗�健�) �譴況 휸뭡�ヴ 그靴� 그 �件健華(� ヴ맸 f)槪 , __init__ 回��읒 �弄影ヴ. �靴≠ 健�� 競�쇰읒밀 셜 力잴  健, FileInfo__init__ 回��ュ self["name"]況 밈穢�ヴ, 그↔鋼 __setitem__槪 經烙맸��, 健↔鋼 그 腱믹 (MP3FileInfo)읒밀 뒨�꼈윈葉밀 그 �件槪 �據尤 솥��윈 그 �件� 回�뎬健�況 淡�恬ヴ. �靴ュ �藜 �ュ 、、� �件�읒 ��윈 그 匯� ↔槪 �� 그靴� ��頌 寧장 �譴�� 靴맑�況 �橒�ヴ.

listDirectoryュ 잽��∽ �□�健ヴュ ↔槪 ����. 그↔鋼 ��읒 �┱ ��� �件槪 ≠�∽ �� 꿱� 鰥��, 玗鋼 潔솥尤 그壽� �件槪 ヴ� � �도刷 �┱ �甦맑≠ 穢��� �ュ�도 ��읒 꿱� 鰥�ヴ. 그↔鋼 그 뒵消�靴況 딘葉밀 庚靴�꺌� �件�槪 黔ュヴ, 그靴� 寧밀 그 腱�梟� 匯�槪 ↑��밀 (MP3FileInfo잴  鋼) �┱ ��� 庚靴 �甦맑�健 穢� ��ュ� ��셜ヴ. 윈壽솥鋼 健 �頌그少槪 蟯��밀 �뮈尤 �據�∽-健華숏윈玲 �甦맑況 穢��劍頌� ヴ患 暎�� �件�槪 庚靴� � �ヴ: HTMLFileInfoュ HTML �件槪 胛�, DOCFileInfoュ ��� .doc �件槪 胛�, ��. listDirectoryュ, �┱ 순±도 ��꼬健, 그 �靈 虔꾑槪 �據� �甦맑읒 ─ ��� 그 ��況 �獵�윈 羊會�劍頌�, 그� 匯듬況 庚靴� ↔健ヴ.

3.16. � �

fileinfo.py槪 健靈ュ 잽�尤 健��꺌梟 �ヴ.

Example 3.39. fileinfo.py

"""Framework for getting filetype-specific metadata.

Instantiate appropriate class with filename.  Returned object acts like a
dictionary, with key-value pairs for each piece of metadata.
    import fileinfo
    info = fileinfo.MP3FileInfo("/music/ap/mahadeva.mp3")
    print "\\n".join(["%s=%s" % (k, v) for k, v in info.items()])

Or use listDirectory function to get info on all files in a directory.
    for info in fileinfo.listDirectory("/music/ap/", [".mp3"]):
        ...

Framework can be extended by adding classes for particular file types, e.g.
HTMLFileInfo, MPGFileInfo, DOCFileInfo.  Each class is completely responsible for
parsing its files appropriately; see MP3FileInfo for example.
"""
import os
import sys
from UserDict import UserDict

def stripnulls(data):
    "strip whitespace and nulls"
    return data.replace("\00", "").strip()

class FileInfo(UserDict):
    "store file metadata"
    def __init__(self, filename=None):
        UserDict.__init__(self)
        self["name"] = filename

class MP3FileInfo(FileInfo):
    "store ID3v1.0 MP3 tags"
    tagDataMap = {"title"   : (  3,  33, stripnulls),
                  "artist"  : ( 33,  63, stripnulls),
                  "album"   : ( 63,  93, stripnulls),
                  "year"    : ( 93,  97, stripnulls),
                  "comment" : ( 97, 126, stripnulls),
                  "genre"   : (127, 128, ord)}

    def __parse(self, filename):
        "parse ID3v1.0 tags from MP3 file"
        self.clear()
        try:
            fsock = open(filename, "rb", 0)
            try:
                fsock.seek(-128, 2)
                tagdata = fsock.read(128)
            finally:
                fsock.close()
            if tagdata[:3] == "TAG":
                for tag, (start, end, parseFunc) in self.tagDataMap.items():
                    self[tag] = parseFunc(tagdata[start:end])
        except IOError:
            pass

    def __setitem__(self, key, item):
        if key == "name" and item:
            self.__parse(item)
        FileInfo.__setitem__(self, key, item)

def listDirectory(directory, fileExtList):
    "get list of file info objects for files of particular extensions"
    fileExtList = [ext.upper() for ext in fileExtList]
    fileList = [os.path.join(directory, f) for f in os.listdir(directory) \
                if os.path.splitext(f)[1].upper() in fileExtList]
    def getFileInfoClass(filename, module=sys.modules[FileInfo.__module__]):
        "get file info class from filename extension"
        subclass = "%sFileInfo" % os.path.splitext(filename)[1].upper()[1:]
        return hasattr(module, subclass) and getattr(module, subclass) or FileInfo
    return [getFileInfoClass(f)(f) for f in fileList]

if __name__ == "__main__":
    for info in listDirectory("/music/_singles/", [".mp3"]):
        print "\n".join(["%s=%s" % (k, v) for k, v in info.items()])
        print

ヴ舡 �劍頌 ヴ健�� ��≠� �읒,윈壽솥鋼 健壽� 匯� ↔�槪 �꿴�∽ ニ臘ュ� 蟯乾��:



[4] �健�읒ュ ��≠ 꼬ヴ. 윈壽솥健 읽�尤 �悚梟 �ヴ� 匯� ↔鋼 순±� � �ヴ. 健↔鋼 �健�� �� 읏靴燁� �寧잴 會껍 ┮�玲ヴ : 寧흴 �胛ュ ���� 숩ヴュ ���� 恍껍꺌 �ヴ. 梟� 윈壽솥健 玲若頌 None』槪 순±��況 읏�ヴ�, 윈壽솥鋼 그峀∽ � � �ヴ, 그壽寧 윈壽솥� ��≠ 뒵�� 숄≠��∽ ��槪 ┐ 寧읒∽ マ淞 읫� 譁�.

[5] �粱尤 健꺌� �밀, ��乾 回��ュ 그�� �甦맑 黎읒밀 閻깜≠��ヴ, �� 릴∽ 閻깜≠��� 꿩槪 �華健ヴ. �健�읒밀ュ �┱ ↔도 玲若頌 ��乾 ↔鋼 꼬ヴ; 蘆쇰�劍頌, ��乾 回��잴 뱃뭡�� 健華鋼 솥�尤 獵潢�� 솥���밀 그�� ��玲 健華劍頌ュ 閻깜숄≠��도刷 숩健∽ 梟�ヴ. 윈壽솥鋼 MP3FileInfo�甦맑� __parse回��읒 _MP3FileInfo__parse�ュ 健華劍頌 閻깜� � �ヴ. 健↔健 �藜�ヴュ ↔槪 乾穢��, 그靴� 據�頌, 據�頌, �靈��읒밀 그峀∽ �� 꿩∫ヴ� �뱃��. ��乾 回��ュ �┱ 健傑頌 ��健ヴ, 그壽寧 ヴ患 皇鋼 ↔�庚韶 �健�읒밀ュ, 그�� ���粱健�ュ ↔鋼 궷굄�劍頌ュ �松� 珞靈健�, ∠靈� 珞靈≠ 껍レヴ.

[6] 그峀� 꿩劍�, ����읏�健 묽���健, �齬�寧 윈壽솥� �頌그少鋼 숄輛�乾 �胛況 ��� ↔健ヴ.


<< 靈 2 � ↑�� � � 量 靈 4 � HTML 庚靴�� >>