¾ÕÀ¸·Î    ¸ñÂ÷    1    2    3    Á¦4Àå    5    6    7    8    ´ÙÀ½À¸·Î

4. ÆÄÀ̽ãÀ¸·Î ÇÁ·Î±×·¡¹Ö Çϱâ

4.1. Á¤ÁöÁ¡, °Ç³Ê¶Ù±â, µîµîÀ» °¡Áø ¼Ò½º ¼öÁØÀÇ µð¹ö°Å°¡ ÀÖ³ª¿ä.?

³× ÀÖ½À´Ï´Ù, ¸ðµâ pdb´Â, ¶óÀ̺귯¸® ÂüÁ¶ ¸Å´º¾ó¿¡ ¹®¼­È­µÈ´ë·Î, ÆÄÀ̽ãÀ» À§ÇÑ ÀûÀýÇÑ ±âº» µð¹ö°ÅÀÔ´Ï´Ù. ¶ÇÇÑ ÀڽŸ¸ÀÇ µð¹ö°Å¸¦ pdb¿ë Äڵ带 ¿¹Á¦·Î »ç¿ëÇÏ¿© ÀÛ¼ºÇÒ ¼ö ÀÖ½À´Ï´Ù.

¶Ç ÆÄÀ̽ãÀ©Àº GUI µð¹ö°Åµµ »ç¿ë°¡´ÉÇѵ¥, bdb¿¡ ±âÃÊÇÏ°í ÀÖÀ¸¸ç, Á¤ÁöÁ¡¿¡ »ö»óÀ» Ç¥ÇöÇÏ¿© ÁÖ°í (ºñ-ÆÄÀ̽ãÀ© ÇÁ·Î±×·¥À» µð¹ö±ëÇÏ´Â °ÍÀ» Æ÷ÇÔÇÏ¿©) »ó´çÈ÷ ÈǸ¢ÇÑ »ç¾çÀ» °¡Áö°í ÀÖ½À´Ï´Ù. ÀÎÅÍÆäÀ̽º¿¡ Àͼ÷ÇØÁö·Á¸é ¾à°£ ¼ö°í¸¦ ÇØ¾ß ÇÏÁö¸¸, ±×·³¿¡µµ ºÒ±¸ÇÏ°í Èï¹Ì ÀÖ½À´Ï´Ù. ÂüÁ¶Á¡Àº ´ÙÀ½¿¡¼­ ã¾Æ º¸½Ç ¼ö ÀÖ½À´Ï´Ù

    http://www.python.org/ftp/python/pythonwin/pwindex.html
ÃÖ±ÙÀÇ ÆÄÀ̽ãÀ© ¹öÀüÀº ¾×ƼºêÆÄÀ̽ãÀÇ ÀϺημ­ »ç¿ë°¡´ÉÇÕ´Ï´Ù. ´ÙÀ½À» ÂüÁ¶ Çϼ¼¿ä

    http://www.activestate.com/Products/ActivePython/index.html
¸®Â÷µå ¿ïÇÁ(Richard Wolff)´Â pdbÀÇ º¯°æµÈ ¹öÀüÀ» ¸¸µé¾ú´Âµ¥, Pydb¶ó°í ºÒ¸®¿ì¸ç, Àαâ ÀÖ´Â µ¥ÀÌŸ Ç¥½Ã µð¹ö°Å(Data Display Debugger (DDD))¿¡ »ç¿ëµÇ°í ÀÖ½À´Ï´Ù. Pydb´Â ´ÙÀ½ http://daikon.tuc.noao.edu/python/¿¡¼­ ãÀ» ¼ö ÀÖ°í, ±×¸®°í DDD´Â ´ÙÀ½ http://www.cs.tu-bs.de/softech/ddd/¿¡¼­ ¹ß°ßÇÒ ¼ö ÀÖ½À´Ï´Ù.

IDLEÀÇ »óÈ£´ëÈ­ÀûÀÎ °³¹ß ȯ°æÀº, º¸ÅëÀº Ç¥ÁØ ¹èÆ÷º»ÀÇ Tools/idle¿¡¼­ »ç¿ë°¡´ÉÇѵ¥, ¶ÇÇÑ ±×·¡ÇÈ µð¹ö°Å¸¦ Æ÷ÇÔÇÕ´Ï´Ù.


4.2. ¾î¶² ¸Þ¼Òµå´Â C·Î ±¸ÇöµÇ¾î ÀÖ°í ´Ù¸¥ °ÍÀº PythonÀ¸·Î ±¸ÇöµÇ¾î ÀÖ´Â ¸Þ½îµåµéÀ» °¡Áö°í °´Ã¼ Ŭ·¡½º¸¦ ¸¸µé ¼ö ÀÖ³ª¿ä (¿¹. »ó¼ÓÀ» ÅëÇÏ¿©)? (´Ù¸¥ ¸»·Î Çϸé: ³»Àå ÇüÀ» ±âº» Ŭ·¡½º·Î »ç¿ëÇÒ ¼ö ÀÖ³ª¿ä?)

¾ÈµË´Ï´Ù, ±×·¯³ª ³»Àå °´Ã¼¸¦ µÑ·¯½Î´Â Æ÷ÀåÀÚ·Î ±â´ÉÇÏ´Â ÆÄÀ̽ã Ŭ·¡½º¸¦ ½±°Ô ÀÛ¼ºÇÒ ¼ö ÀÖ½À´Ï´Ù, (¿¹. »çÀü):

        # A user-defined class behaving almost identical
        # to a built-in dictionary.
        class UserDict:
                def __init__(self): self.data = {}
                def __repr__(self): return repr(self.data)
                def __cmp__(self, dict):
                        if type(dict) == type(self.data):
                                return cmp(self.data, dict)
                        else:
                                return cmp(self.data, dict.data)
                def __len__(self): return len(self.data)
                def __getitem__(self, key): return self.data[key]
                def __setitem__(self, key, item): self.data[key] = item
                def __delitem__(self, key): del self.data[key]
                def keys(self): return self.data.keys()
                def items(self): return self.data.items()
                def values(self): return self.data.values()
                def has_key(self, key): return self.data.has_key(key)
A2. Áü Ǯư(Jim Fulton)ÀÇ ExtensionClass¸¦ º¸½Ã¸é ½´ÆÛ Å¬·¡½º¸¦ °¡Áöµµ·Ï Çã¿ëÇÏ´Â ¸ÞÄ«´ÏÁòÀÇ ¿¹¸¦ º¸½Ç ¼ö Àִµ¥ ÆÄÀ̽㿡¼­ ±× ½´ÆÛ Å¬·¡½º·ÎºÎÅÍ »ó¼Ó¹ÞÀ» ¼ö ÀÖ½À´Ï´Ù -- ±×·±½ÄÀ¸·Î ¾î¶² ¸Þ½îµå´Â C ½´ÆÛŬ·¡½º·ÎºÎÅÍ °¡Áú ¼ö ÀÖÀ¸¸ç (ÀÌ°ÍÀ» ¼¯¾î³Ö±â(mixin)À̶ó°í ºÎ¸¨´Ï´Ù) ¶Ç ¾î¶² ¸Þ½îµå´Â ÆÄÀ̽ãÀÇ ½´ÆÛŬ·¡½º ȤÀº ¿©·¯ºÐÀÇ ÇϺÎŬ·¡½º·ÎºÎÅÍ °¡Áú ¼ö ÀÖ½À´Ï´Ù. ´ÙÀ½À» ÂüÁ¶Çϼ¼¿ä http://www.digicool.co m/papers/ExtensionClass.html.

A3. ºÎ½ºÆ® ÆÄÀ̽㠶óÀ̺귯¸® (BPL, http://www.boost.org/libs/python/doc/index.html)¿¡¼­´Â C++À¸·ÎºÎÅÍ ÀÌ·¸°Ô ÇÏ´Â ¹æ¹ýÀ» Á¦°øÇÕ´Ï´Ù (Áï. BPLÀ» »ç¿ëÇؼ­ C++·Î ÀÛ¼ºµÇ¾îÁø È®Àå Ŭ·¡½º·ÎºÎÅÍ »ó¼Ó¹ÞÀ» ¼ö ÀÖ½À´Ï´Ù).


4.3. ÆÄÀ̽ãÀ» À§ÇÑ curses/termcap ÆÐÅ°Áö°¡ ÀÖ³ª¿ä?

Ç¥ÁØ ÆÄÀ̽㠹èÆ÷º»¿¡ curses ¸ðµâÀÌ µû¶ó¿À´Âµ¥, Modules/ ÇϺΠµð·ºÅ丮¿¡ ÀÖ½À´Ï´Ù, ±×·¸Áö¸¸ ±âº» °ªÀ¸·Î ÄÄÆÄÀÏ µÇÁö ¾Ê½À´Ï´Ù. ÆÄÀ̽ã 2.0 ÀÌÀü ¹öÀü¿¡¼­, ±× ¸ðµâÀº Æò¹üÇÑ curses ¸¸À» Áö¿øÇÕ´Ï´Ù; »ö»óÀ» »ç¿ëÇÏ´Â ncurses »ç¾çÀ» »ç¿ëÇÒ ¼ö´Â ¾ø½À´Ï´Ù. (±×·¸Áö¸¸ ±×°ÍÀº ncurses¿Í ¿¬°áµÉ °ÍÀÔ´Ï´Ù).

ÆÄÀ̽ã 2.0¿¡¼­, curses ¸ðµâÀº ±ØÀûÀ¸·Î È®´ëµÇ¾î¼­, ¿Ã¸®¹ö ¾Èµå¸®È÷(Oliver Andrich)ÀÇ °³¼±µÈ ¹öÀüÀ¸·ÎºÎÅÍ ½ÃÀÛÇÏ¿©, ncurses¿Í SYSV curses·ÎºÎÅÍ ¿Â ¸¹Àº ºÎ°¡ÀûÀÎ ±â´ÉµéÀ» Á¦°øÇÕ´Ï´Ù. »ö»ó, ´ëüÀûÀÎ ¹®ÀÚ ¸ðÀ½ Áö¿ø, µ¡´ë±â, ±×¸®°í ¸¶¿ì½º Áö¿ø°ú °°Àº ±â´ÉµéÀ» Á¦°øÇÕ´Ï´Ù. ÀÌ°ÍÀº °ð ±× ¸ðµâÀÌ BSD curses¸¸À» °¡Áö´Â ¿î¿µÃ¼Á¦¿Í ´õÀÌ»ó ȣȯµÇÁö ¾Ê´Â´Ù´Â °ÍÀ» ÀǹÌÇÕ´Ï´Ù, ±×·¯³ª ÀÌ ¹üÁÖ¿¡ µé¾î°¥ ¸¸ÇÑ ¿î¿µÃ¼Á¦µéÀÌ ÇöÀç À¯ÁöµÇ°í ÀÖ´Â °Í °°Áö´Â ¾Ê½À´Ï´Ù


4.4. ÆÄÀ̽ã CÀÇ onexit()°ú °°Àº °ÍÀÌ ÀÖ½À´Ï±î?

ÆÄÀ̽ã 2.0¿¡´Â: »õ·Î¿î atexit ¸ðµâÀÌ CÀÇ onexit°ú ºñ½ÁÇÑ µî·Ï ÇÔ¼ö¸¦ Á¦°øÇÕ´Ï´Ù. ´õ ÀÚ¼¼ÇÑ »çÇ×Àº ¶óÀ̺귯¸® ÂüÁ¶¼­¸¦ º¸¼¼¿ä. 2.0 ¿¡ ´ëÇÏ¿©´Â sys.exitfunc¿¡ ÇÒ´çÇؼ­´Â ¾ÊµË´Ï´Ù!

ÆÄÀ̽ã 1.5.2¿¡´Â: sys¸¦ ¼öÀÔÇÏ°í ÇÔ¼ö¸¦ sys.exitfunc¿¡ ÇÒ´çÇÒ ÇÊ¿ä°¡ Àִµ¥, ±×°ÍÀº ÇÁ·Î±×·¥ÀÌ Á¾·áÇÒ ¶§, 󸮵ÇÁö ¾ÊÀº ¿¹¿Ü¿¡ ÀÇÇÏ¿© »ç¸ÁÇÒ¶§, ȤÀº (À¯´Ð½º¿¡¼­) SIGHUP ¶Ç´Â SIGTERMit ½ÅÈ£¸¦ Á¢¼öÇÒ ¶§ È£ÃâµÉ °ÍÀÔ´Ï´Ù.


4.5. ´Ù¸¥ ÇÔ¼ö¾È¿¡ ³»Æ÷½ÃÄÑ ÇÑ ÇÔ¼ö¸¦ Á¤ÀÇÇÒ ¶§ ±× ³»Æ÷µÈ ÇÔ¼ö´Â ¿ÜºÎÀÇ ÇÔ¼ö¿¡ ÀÖ´Â Áö¿ª º¯¼öµé¿¡ Á¢±ÙÇÒ ¼ö ¾ø´Â °Í °°Àºµ¥, ¿Ö ±×·±°¡¿ä? ¾î¶»°Ô Áö¿ª µ¥ÀÌŸ¸¦ ³»Æ÷µÈ ÇÔ¼ö¿¡ °Ç³×³ª¿ä?

ÆÄÀ̽ãÀº ÀÓÀÇÀûÀ¸·Î ³»Æ÷µÈ ¿µ¿ªÀ» °¡ÁöÁö ¾Ê½À´Ï´Ù. Áö¿ªÀûÀ¸·Î »ç¿ë°¡´ÉÇÑ ¾î¶² µ¥ÀÌŸ¿¡ Á¢±ÙÇÒ ÇÊ¿ä°¡ ÀÖ´Â ÇÔ¼ö¸¦ ÀÛ¼ºÇÒ ÇÊ¿ä°¡ ÀÖÀ» ¶§´Â, »õ·Î¿î Ŭ·¡½º¸¦ ¸¸µé¾î¼­ ±× µ¥ÀÌŸ¸¦ À¯ÁöÇÏ°í ±× Å¬·¡½ºÀÇ ½Çü°¡ °¡Áø ¸Þ½îµå¸¦ ¹ÝȯÇϼ¼¿ä, ¿¹¸¦ µé¾î:

        class MultiplierClass:
            def __init__(self, factor):
                self.factor = factor
            def multiplier(self, argument):
                return argument * self.factor
        def generate_multiplier(factor):
            return MultiplierClass(factor).multiplier
        twice = generate_multiplier(2)
        print twice(10)
        # Output: 20
¶Ç ´Ù¸¥ ÇØ°áÃ¥Àº ±âº» Àμö°ªÀ» »ç¿ëÇÕ´Ï´Ù, ¿¹¸¦ µé¾î:

        def generate_multiplier(factor):
            def multiplier(arg, fact = factor):
                return arg*fact
            return multiplier
        twice = generate_multiplier(2)
        print twice(10)
        # Output: 20


4.6. ¿¬¼Ó¿­¿¡ ´ëÇÏ¿© ¹Ý´ë ¼ø¼­·Î ¾î¶»°Ô ¹Ýº¹Çϳª¿ä?

¸¸¾à ¸®½ºÆ®¶ó¸é, °¡Àå ºü¸¥ ÇØ°áÃ¥Àº ´ÙÀ½°ú °°½À´Ï´Ù

        list.reverse()
        try:
                for x in list:
                        "do something with x"
        finally:
                list.reverse()
ÀÌ°ÍÀº ´ÜÁ¡ÀÌ Àִµ¥ ±× ȸµ¹ÀÌ ¾È¿¡ ÀÖ´Â µ¿¾È¿¡ ±× ¸®½ºÆ®´Â ÀÓ½ÃÀûÀ¸·Î ¿ªÀ¸·Î µË´Ï´Ù. ÀÌ°ÍÀÌ ½È´Ù¸é, º¹»çº»À» ¸¸µé ¼ö ÀÖ½À´Ï´Ù. ÀÌ°ÍÀº ´ë°¡°¡ ºñ½Ñ °Í °°ÀÌ º¸ÀÌÁö¸¸ ½ÇÁ¦ÀûÀ¸·Î´Â ´Ù¸¥ ¾î¶² ÇØ°áÃ¥µéº¸´Ù ºü¸¨´Ï´Ù:

        rev = list[:]
        rev.reverse()
        for x in rev:
                <do something with x>
¸¸¾à ¸®½ºÆ®°¡ ¾Æ´Ï¶ó¸é, ´õ¿í ÀϹÝÀûÀ̱ä ÇÏÁö¸¸ ´õ ´À¸° ÇØ°áÃ¥Àº ´ÙÀ½°ú °°½À´Ï´Ù:

        for i in range(len(sequence)-1, -1, -1):
                x = sequence[i]
                <do something with x>
´õ¿í ¿ì¾ÆÇÑ ÇØ°áÃ¥Àº, ¿¬¼Ó¿­Ã³·³ ÇൿÇÏ°í ±× ¿ä¼ÒµéÀ» ¿ªÀÇ ¼ø¼­·Î »êÃâÇϴ Ŭ·¡½º¸¦ Á¤ÀÇÇÏ´Â °ÍÀÔ´Ï´Ù (½ºÆ¼ºê ¸ÓÁ¦½ºÅ°(Steve Majewski)ÀÇ ¹è·Á¿¡ ÀÇÇÑ ÇØ°áÃ¥):

        class Rev:
                def __init__(self, seq):
                        self.forw = seq
                def __len__(self):
                        return len(self.forw)
                def __getitem__(self, i):
                        return self.forw[-(i + 1)]
ÀÌÁ¦ °£°áÇÏ°Ô ´ÙÀ½°ú °°ÀÌ ÀÛ¼ºÇÒ ¼ö ÀÖ½À´Ï´Ù:

        for x in Rev(list):
                <do something with x>
ºÒÇàÇÏ°Ôµµ, ÀÌ ÇØ°áÃ¥Àº ÀÌ ¸ðµç °ÍÁß °¡Àå ´À¸³´Ï´Ù, ¸Þ½îµå È£Ã⠺δ㶧¹®¿¡...


4.7. ³» ÇÁ·Î±×·¥ÀÌ ³Ê¹« ´À·Á¿ä. ¾î¶»°Ô ¼Óµµ¸¦ ¿Ã¸± ¼ö ÀÖ³ª¿ä?

ÀϹÝÀûÀ¸·Î, ¾î·Á¿î ¹®Á¦ÀÔ´Ï´Ù. ÆÄÀ̽ã ÄÚµåÀÇ ¼Óµµ¸¦ ³ôÀÌ´Â ¼ö ¸¹Àº ²Ä¼öµéÀÌ ÀÖ½À´Ï´Ù; Àú¶ó¸é ºÎºÐÀûÀ¸·Î C·Î ÀçÀÛ¼ºÇÏ´Â °ÍÀ» °¡Àå ¸¶Áö¸·À¸·Î °í·ÁÇÏ°Ú½À´Ï´Ù. ÁÖ¸ñÇÒ ÇÑ°¡Áö´Â ÇÔ¼ö¿Í (ƯÈ÷) ¸Þ½îµå È£ÃâÀº ´ë°¡°¡ Å®´Ï´Ù; ½Çü º¯¼ö¸¦ ȹµæÇϰųª ¼³Á¤ÇÏ´Â °Í ȤÀº ¶Ç ´Ù¸¥ ¸Þ½îµå¸¦ È£ÃâÇÏ´Â °Í ÀÌ»óÀÇ ÀÏÀ» ÇÏÁö ¾Ê´Â, ¸¹Àº ÀÛÀº ÇÔ¼öµé°úÀÇ °´Ã¼ ÁöÇâÀûÀÎ ÀÎÅÍÆäÀ̽º¸¦ µðÀÚÀÎÇÑ´Ù¸é, ´õ¿í Á÷Á¢ÀûÀÎ ¹æ½ÄÀÇ »ç¿ëÀ» °í·ÁÇصµ ÁÁ½À´Ï´Ù, ¿¹¸¦ µé¾î. ½Çü º¯¼öµé¿¡ Á÷Á¢ÀûÀ¸·Î Á¢±ÙÇصµ ÁÁ½À´Ï´Ù. ¶Ç Ç¥ÁØ ¸ðµâ "profile"À» ÂüÁ¶ÇϽøé (¶óÀ̺귯¸® ÂüÁ¶ ¸Å´º¾ó¿¡ ¼³¸íµÈ´ë·Î) ±× ¸ðµâ·Î ÇÁ·Î±×·¥ÀÌ ¾î´À ºÎºÐ¿¡¼­ ´ëºÎºÐÀÇ ½Ã°£À» ¼ÒºñÇÏ´ÂÁö¸¦ ã¾Æ ³¾ ¼ö ÀÖ½À´Ï´Ù (¸¸¾à Àγ»½ÉÀÌ ÀÖ´Ù¸é -- ¼º´ÉÃÖÀûÈ­ ±× ÀÚü´Â ÇÁ·Î±×·¥ÀÇ ¼Óµµ¸¦ ¾ö°ÝÇÑ ±× ¸¸Å­ ¶³¾î ¶ß¸³´Ï´Ù).

±â¾ïÇÏ½Ç °ÍÀº ´Ù¸¥ ÇÁ·Î±×·¡¹Ö °æÇèÀ¸·ÎºÎÅÍ ¾Ë°í ÀÖ´Â, ¸¹Àº Ç¥ÁØ ÃÖÀûÈ­ °æÇèµéÀÌ ÆÄÀ̽㿡µµ Àß Àû¿ëµÉ ¼ö ÀÖ´Ù´Â °ÍÀÔ´Ï´Ù. ¿¹¸¦ µé¾î Ä¿³Î ½Ã½ºÅÛ È£ÃâÀÇ ºÎ´ãÀ» ÇÇÇϱâ À§ÇÏ¿© ÀÛÀº Ãâ·Â±â¸¦ »ç¿ëÇÏ´Â °Íº¸´Ù ´õ Å« Ãâ·Â±â¸¦ »ç¿ëÇÏ¿© Ãâ·Â ÀåÄ¡¿¡ Ãâ·ÂÀ» º¸³»´Â °ÍÀÌ ´õ ºü¸¦ ¼öµµ ÀÖ½À´Ï´Ù. ±×·±½ÄÀ¸·Î "ÇÑ ¹ø¿¡" ¸ðµç Ãâ·ÂÀ» ½á³»´Â CGI ½ºÅ©¸³Æ®°¡ ¸¹Àº Á¶°¢ÀÇ Ãâ·ÂÀ» ½á ³»´Â ½ºÅ©¸³Æ®º¸´Ù ÇöÀúÇÏ°Ô ´õ ºü¸¦ ¼öµµ ÀÖ½À´Ï´Ù.

¶ÇÇÑ, ÀûÀýÇÑ °÷¿¡ È®½ÇÇÏ°Ô "ÁýÇÕ(aggregate)" ¿¬»êÀ» »ç¿ëÇϼ¼¿ä. ¿¹¸¦ µé¾î "Á¶°¢ ½ä±â(slicing)" »ç¾çÀ¸·Î ÇÁ·Î±×·¥Àº, °íµµ·Î ÃÖÀûÈ­µÈ C ±¸ÇöÀ» »ç¿ëÇÏ¿©, ¸®½ºÆ®¿Í ´Ù¸¥ ¿¬¼Ó¿­ °´Ã¼µéÀ» ÀÎÅÍÇÁ¸®ÅÍÀÇ ÁÖȸµ¹ÀÌÀÇ ÇÑ ¼ø°£¿¡ ½ä ¼ö ÀÖ½À´Ï´Ù. ±×¸®ÇÏ¿© °°Àº È¿°ú¸¦ ´ÙÀ½°ú °°ÀÌ ¾òÀ» ¼ö ÀÖ½À´Ï´Ù.

  L2 = []
  for i in range[3]:
       L2.append(L1[i])
ÀÌ°ÍÀÌ »ç¿ëÇϱ⿡ ÈξÀ ´õ ª°í ºü¸¨´Ï´Ù

  L2 = list(L1[:3]) # "list" is redundant if L1 is a list.
ÁÖ¸ñÇÒ °ÍÀº map() ÇÔ¼ö°¡, ƯÈ÷ ³»Àå ¸Þ½îµå ȤÀº ³»Àå ÇÔ¼öµé°ú »ç¿ëµÇ¸é, Æí¸®ÇÑ °¡¼Ó±â°¡ µÉ ¼ö ÀÖ´Ù´Â °ÍÀÔ´Ï´Ù. ¿¹¸¦ µé¾î µÎ °³ÀÇ ¸®½ºÆ®¿¡ ÀÖ´Â ¿ä¼ÒµéÀ» ÇÔ²² ¦ÁöÀ¸·Á¸é:

  >>> map(None, [1,2,3], [4,5,6])
  [(1, 4), (2, 5), (3, 6)]
¶Ç´Â »çÀÎÀÇ ¼öÄ¡¸¦ °è»êÇÏ·Á¸é:

  >>> map( math.sin, (1,2,3,4))
  [0.841470984808, 0.909297426826, 0.14112000806,   -0.756802495308]
¦Áþ±â ¿¬»êÀº ÀÌ·¯ÇÑ °æ¿ì¿¡ ´ë´ÜÈ÷ ºü¸£°Ô ¿Ï°áµË´Ï´Ù.

ÁýÇÕ ¿¬»êÀÇ ¿¹Á¦¿¡´Â ¹®ÀÚ¿­ °´Ã¼ÀÇ join°ú split ¸Þ½îµå°¡ Æ÷ÇԵ˴ϴÙ. ¿¹¸¦ µé¾î ¸¸¾à s1..s7 ÀÌ °Å´ëÇÑ (10K+) ¹®ÀÚ¿­À̶ó¸é "".join([s1,s2,s3,s4,s5,s6,s7])Àº ´õ ¸íÈ®ÇØ º¸ÀÌ´Â s1+s2+s3+s4+s5+s6+s7º¸´Ù ÈξÀ ´õ ºü¸¦ ¼ö ÀÖ½À´Ï´Ù, ¿Ö³ÄÇϸé "µ¡¼À"Àº ¸¹Àº ÇϺΠǥÇö½ÄÀ» °è»êÇÏ´Â ¹Ý¸é¿¡ joinÀº ´Ü Çѹø¿¡ ¸ðµç °ÍÀ» º¹»çÇϱ⠶§¹®ÀÔ´Ï´Ù. ¹®ÀÚ¿­À» ´Ù·ç·Á¸é ¶ÇÇÑ Á¤±Ô Ç¥Çö½Ä ¶óÀ̺귯¸®¸¦ °í·ÁÇØ º¸¼¼¿ä. ±×¸®°í "´ëü(substitution)" ¿¬»ê String % tuple °ú String % dictionary¸¦ °í·ÁÇØ º¸¼¼¿ä. ¶ÇÇÑ Á¤·ÄÇϱâ À§Çؼ­´Â È®½ÇÇÏ°Ô list.sort ³»Àå ¸Þ½îµå¸¦ »ç¿ëÇϼ¼¿ä, ±×¸®°í FAQÀÇ 4.51°ú 4.59¸¦ º¸½Ã¸é ¾Ë¸Â°Ô °³¼±µÈ »ç¿ë¹ýÀÇ ¿¹µéÀ» º¸½Ç ¼ö ÀÖ½À´Ï´Ù -- list.sort´Â Á¤·Ä¿¡ °üÇÑÇÑ ´Ù¸¥ ¾î¶² Å×Å©´Ðº¸´Ù ¶Ù¾î³ªÁö¸¸, ´ë´ÜÈ÷ ±Ø´ÜÀûÀΠȯ°æÀ» ¿ä±¸ÇÕ´Ï´Ù.

Ç¥ÁØ ¶óÀ̺귯¸®¿Í °øÇåµÈ ¶óÀ̺귯¸® ±×¸®°í È®Àå¿¡´Â, ´Ù¸¥ ¸¹Àº ÁýÇÕ ¿¬»êÀÌ ÀÖ½À´Ï´Ù.

¶Ç ´Ù¸¥ ÀϹÝÀûÀÎ ²Ä¼ö´Â "ȸµ¹À̸¦ ÇÔ¼ö ȤÀº ¸Þ½îµå ¾ÈÀ¸·Î Áý¾î ³Ö´Â °Í"ÀÔ´Ï´Ù. ¿¹¸¦ µé¾î ´À¸®°Ô ½ÇÇàµÇ´Â ÇÁ·Î±×·¥ÀÌ ÀÖ°í ¼º´ÉÃÖÀûÈ­±â(profiler)¸¦ »ç¿ëÇÏ¿© (profile.run) ÆÄÀ̽ã ÇÔ¼ö ff°¡ ¾ó¸¶³ª ÀÚÁÖ È£ÃâµÇ°í Àִ°¡ °áÁ¤ÇÑ´Ù°í °¡Á¤ÇØ º¾½Ã´Ù. ¸¸¾à ff°¡ ´ÙÀ½°ú °°ÀÌ

   def ff(x):
       ...do something with x computing result...
       return result
ȸµ¹ÀÌ ¾È¿¡¼­ (A)¿Í °°ÀÌ È£ÃâµÈ´Ù´Â °ÍÀ» ¾Ë°Ô µÇ¸é

   list = map(ff, oldlist)
ȤÀº (B)¿Í °°ÀÌ È£ÃâµÈ´Ù´Â °ÍÀ» ±ú´Ý°Ô µÇ¸é

   for x in sequence:
       value = ff(x)
       ...do something with value...
±×·¯¸é ´ÙÀ½°ú °°ÀÌ ff¸¦ ÀçÀÛ¼º ÇÔÀ¸·Î½á, ÇÔ¼ö È£Ã⠺δãÀ» Á¦°ÅÇÒ ¼ö ÀÖ½À´Ï´Ù.

   def ffseq(seq):
       resultseq = []
       for x in seq:
           ...do something with x computing result...
           resultseq.append(result)
       return resultseq
±×¸®°í (A)¸¦ ´ÙÀ½°ú °°ÀÌ ÀçÀÛ¼ºÇϰųª

    list = ffseq(oldlist)
(B)¸¦ ´ÙÀ½°ú °°ÀÌ ÀçÀÛ¼ºÇÒ ¼ö ÀÖ½À´Ï´Ù.

    for value in ffseq(sequence):
        ...do something with value...
´Ù¸¥ ´Ü¼ø È£Ãâ ff(x)´Â ¾Æ¹«·± ºÎ´ã¾øÀÌ ffseq([x])[0]À¸·Î ¹ø¿ªµË´Ï´Ù. ¹°·Ð ÀÌ Å×Å©´ÐÀº Ç×»ó ÀûÀýÇÑ °ÍÀº ¾Æ´Õ´Ï´Ù ±×¸®°í ´Ù¸¥ º¯Á¾µéÀÌ ÀÖÁö¸¸, ¿©·¯ºÐÀº ÀÌÇØ ÇÒ ¼ö ÀÖ½À´Ï´Ù.

Áö¿ª º¯¼ö¿¡ ´ëÇÑ ÇÔ¼ö³ª ¸Þ½îµåÀÇ ÂüÁ¶ °á°ú¸¦ ¸í½ÃÀûÀ¸·Î ÀúÀåÇÏ¸é ¼º´ÉÁõ°¡¸¦ ¾òÀ» ¼ö ÀÖ½À´Ï´Ù. ´ÙÀ½°ú °°Àº ȸµ¹ÀÌ´Â

    for key in token:
        dict[key] = dict.get(key, 0) + 1
¸Å ¹Ýº¹¸¶´Ù dict.getÀ» °áÁ¤ÇÕ´Ï´Ù. ¸¸¾à ±× ¸Þ½îµå°¡ º¯°æµÇÁö ¾Ê´Â´Ù¸é, ´õ ºü¸¥ ±¸ÇöÀº ´ÙÀ½°ú °°½À´Ï´Ù.

    dict_get = dict.get  # look up the method once
    for key in token:
        dict[key] = dict_get(key, 0) + 1
±âº» ÀμöµéÀº ½ÇÇà½Ã°£ ´ë½Å¿¡ ÄÄÆÄÀÏ ½Ã°£¿¡ °ªµéÀ», °áÁ¤Çϴµ¥ Çѹø »ç¿ëµÉ ¼ö ÀÖ½À´Ï´Ù. ÇÁ·Î±×·¥ÀÌ ½ÇÇàµÇ´Â µ¿¾È¿¡ º¯°æµÇÁö ¾ÊÀ» °´Ã¼ ȤÀº ÇÔ¼öµé¿¡ ´ëÇؼ­´Â Àû¿ëµÉ ¼ö ÀÖ½À´Ï´Ù, ´ÙÀ½°ú °°ÀÌ ´ëüÇÑ´Ù¸é

    def degree_sin(deg):
        return math.sin(deg * math.pi / 180.0)

    def degree_sin(deg, factor = math.pi/180.0, sin = math.sin):
        return sin(deg * factor)
ÀÌ ²Ä¼ö´Â ±âº» ÀμöµéÀ» º¯°æµÇ¾î¼­´Â ¾ÈµÈ´Ù´Â Á¶°ÇÇÏ¿¡ »ç¿ëÇϱ⠶§¹®¿¡, ±×°ÍÀº »ç¿ëÀÚ¿¡°Ô È¥¶õ½º·± API¸¦ Á¦°øÇÒ °¡´É¼º¿¡ ´ëÇÏ¿© ¿°·ÁµÇÁö ¾ÊÀ» ¶§¸¸ »ç¿ëµÇ¾îÁ®¾ß ÇÕ´Ï´Ù.

ÃÖÀûÈ­¿¡ °ü·ÃµÈ ÀÏÈ­¸¦ º¸½Ã·Á¸é, ´ÙÀ½À» ÂüÁ¶Çϼ¼¿ä

	essays/list2str.html


4.8. ¸ðµâÀ» ¼öÀÔÇÏ¿©, ±×°ÍÀ» ÆíÁýÇÏ°í ( °°Àº ÆÄÀ̽ã ÇÁ·Î¼¼½º ¾ÈÀ¸·Î) ´Ù½Ã ¼öÀÔÇÒ ¶§, º¯°æÇÑ °ÍÀÌ ÀÛ¿ëÇÏÁö ¾Ê´Â µíÀÌ º¸ÀÔ´Ï´Ù, ¹«¾ù ¶§¹®Àΰ¡¿ä?

È¿À²¼º°ú ÀÏ°ü¼ºÀÇ ÀÌÀ¯ ¶§¹®¿¡, ÆÄÀ̽ãÀº ¿ÀÁ÷ ±× ¸ðµâ ÆÄÀÏÀ» óÀ½À¸·Î ¼öÀÔÇÒ ¶§¸¸ ÀнÀ´Ï´Ù. (±×·¸Áö ¾ÊÀ¸¸é ¸¹Àº ¸ðµâ·Î ÀÌ·ç¾îÁø ÇÁ·Î±×·¥, °¢°¢ÀÌ °°Àº ±âº» ¸ðµâÀ» ¼öÀÔÇÑ´Ù¸é, ±× ±âº» ¸ðµâÀ» ÀÐ°í ¶Ç ÀÐÀ» °ÍÀÔ´Ï´Ù.) °­Á¦·Î º¯°æµÈ ÆÄÀÏÀ» Àеµ·Ï ÇÏ·Á¸é, ÀÌ·¸°Ô Çϼ¼¿ä:

        import modname
        reload(modname)
°æ°í: ÀÌ Å×Å©´ÐÀº 100% ¿ÏÀüÇÏ°Ô-Áõ¸íµÈ °ÍÀº ¾Æ´Õ´Ï´Ù. ƯÈ÷, ´ÙÀ½°ú °°Àº ¼­¼ú¹®À» ´ã°í ÀÖ´Â ¸ðµâµéÀº

        from modname import some_objects
±× ¼öÀÔµÈ °´Ã¼µéÀÇ ±¸Çü ¹öÀü°úµµ °è¼ÓÇÏ¿© Àß ÀÛµ¿ÇÒ °ÍÀÔ´Ï´Ù.


4.9. ¾î¶»°Ô ÇöÀç ¸ðµâÀÇ À̸§À» ¾Æ³ª¿ä?

¸ðµâÀº ÀÚ½ÅÀÇ À̸§À» (¹Ì¸® Á¤ÀǵÈ) Àü¿ª º¯¼ö __name__À» »ìÆ캽À¸·Î½á ¾Ë ¼ö ÀÖ½À´Ï´Ù. ¸¸¾à ÀÌ°ÍÀÌ °ª '__main__'À» °¡Áö¸é ¿©·¯ºÐÀº ½ºÅ©¸³Æ®·Î¼­ ½ÇÇàÇÏ°í ÀÖ´Â °ÍÀÔ´Ï´Ù.


4.10. ÇÑ ¸ðµâÀÌ ½ºÅ©¸³Æ®·Î ½ÇÇàµÉ ¶§ ¾î¶² ¿©ºÐÀÇ Äڵ带 ½ÇÇàÇϱ⸦ ¿øÇÕ´Ï´Ù. ³»°¡ ½ºÅ©¸³Æ®·Î ½ÇÇàÁßÀÎÁö ¾Æ´ÑÁö¸¦ ¾î¶»°Ô ¾Ð´Ï±î?

ÀÌÀüÀÇ Áú¹®À» ÂüÁ¶Çϼ¼¿ä. ¿¹¸¦ µé¾î ¸¸¾à ´ÙÀ½À» ¸ðµâÀÇ ¸¶Áö¸· ¶óÀο¡ ³õ´Â´Ù¸é, main()Àº ¸ðµâÀÌ ½ºÅ©¸³Æ®·Î ½ÇÇàµÉ ¶§¸¸ È£ÃâµË´Ï´Ù:

        if __name__ == '__main__': main()


4.11. µ¥¸ð µð·ºÅ丮ºÎÅÍ ÇÁ·Î±×·¥ Çϳª¸¦ ½ÇÇàÇÏ·Á°í ÇÏ¿´Áö¸¸ ImportError¸¦ °¡Áö°í ½ÇÆÐÇÕ´Ï´Ù: No module named ...; ¹«¾ùÀÌ ¹®Á¦Àΰ¡¿ä?

ÀÌ°ÍÀº ¾Æ¸¶µµ (C·Î ¾º¿©Áø) ¼±ÅÃÀûÀÎ ¸ðµâÀÌ ½Ã½ºÅÛ¿¡ ¼³Á¤µÇÁö ¾Ê¾Ò±â ¶§¹®ÀÏ °ÍÀÔ´Ï´Ù. ƯÈ÷ ÀÌ°ÍÀº "Tkinter", "stdwin", "gl", "Xt" ¶Ç´Â "Xm"°ú °°Àº ¸ðµâµé¿¡ ÀÚÁÖ ÀϾ´Ï´Ù. Tkinter, STDWIN °ú ´Ù¸¥ ¸¹Àº ¸ðµâ¿¡ ´ëÇؼ­´Â, Modules/Setup.inÀ» »ìÆ캸½Ã¸é, °¡´ÉÇϱ⸸ ÇÏ´Ù¸é, ÀÌ·¯ÇÑ ¸ðµâµéÀ» ÆÄÀ̽㿡 Ãß°¡ÇÏ´Â ¹ý¿¡ ´ëÇÑ Á¤º¸°¡ ÀÖ½À´Ï´Ù. ¶§·Î´Â ¶Ç ´Ù¸¥ ÆÐÅ°Áö¸¦ (¿¹¸¦ µé¾î, Tkinter¸¦ À§Çؼ­´Â Tcl¿Í Tk¸¦) ftp·Î ¸ÕÀú ³»·Á¹ÞÀ» ÇÊ¿ä°¡ ÀÖÀ» °ÍÀÔ´Ï´Ù. ¶§·Î´Â ±× ¸ðµâÀº Ç÷§Æû Á¾¼ÓÀûÀ¸·Î¸¸ ÀÛµ¿ÇÕ´Ï´Ù. (¿¹¸¦ µé¾î, glÀº ¿ÀÁ÷ SGI ¸Ó½Å¿¡¼­¸¸ ÀÛµ¿ÇÕ´Ï´Ù).

ÁÖÀÇ: ¸¸¾à ºÒÆòÀÌ "Tkinter" (´ë¹®ÀÚ T)¿¡ °üÇÑ °ÍÀÌ°í ÀÌ¹Ì "tkinter" (¼Ò¹®ÀÚ t) ¸ðµâÀ» ¼³Á¤ÇÏ¿´´Ù¸é, ÇØ°áÃ¥Àº tkinter¸¦ TkinterÀ¸·Î ȤÀº ±× ¹Ý´ë·Î À̸§À» ¹Ù²ÙÁö ¾Ê´Â °ÍÀÔ´Ï´Ù. ºÐ¸íÈ÷ ¸ðµâ Ž»ö °æ·Î¿¡ ¹«¾ùÀΰ¡ À߸øÀÌ ÀÖ½À´Ï´Ù. sys.pathÀÇ °ªÀ» Á¡°ËÇØ º¸¼¼¿ä.

X-°ü·Ã ¸ðµâ (Xt¿Í Xm)¿¡ ´ëÇؼ­´Â, ´õ ¸¹Àº ÀÛ¾÷ÀÌ ÇÊ¿äÇÒ °ÍÀÔ´Ï´Ù: ±× ¸ðµâµéÀº ÇöÀç·Î Ç¥ÁØ ÆÄÀ̽㠹èÆ÷º»¿¡ Æ÷ÇÔµÇÁö ¾Ê½À´Ï´Ù. ftp·Î ±× È®Àå tar ÆÄÀÏÀ» ³»·Á ¹ÞÀ» ÇÊ¿ä°¡ ÀÖ½À´Ï´Ù, Áï. ´ÙÀ½¿¡¼­ ftp://ftp.python.org/pub/python/src/X-extension.tar.gz ³»·Á¹Þ°í ±×¸®°í °Å±â¿¡ ÀÖ´Â Áö½Ã»çÇ×À» µû¸£¼¼¿ä.

´ÙÀ½ Áú¹®µµ ÂüÁ¶Çϼ¼¿ä.


4.12. STDWINÀ¸·Î ¼º°øÀûÀ¸·Î ÆÄÀ̽ãÀ» ±¸ÃàÇÏ¿´½À´Ï´Ù ±×·¯³ª ¾î¶² ¸ðµâÀ» ãÁö ¸øÇÕ´Ï´Ù (¿¹¸¦ µé¾î. stdwinevents).

'stdwin'¶ó´Â À̸§ÀÇ ¶óÀ̺귯¸® µð·ºÅ丮¿¡´Â ÇϺεð·ºÅ丮°¡ Àִµ¥ ¹Ýµå½Ã ±âº» ¸ðµâ Ž»ö °æ·Î¿¡ ÀÖ¾î¾ß ÇÕ´Ï´Ù. Modules/Setup(.in)¿¡´Â ÀÌ·¯ÇÑ ¸ñÀûÀ» À§ÇÏ¿© »ç¿ë°¡´ÉÇÏ°Ô ÇؾßÇÒ ¶óÀÎÀÌ ÀÖ½À´Ï´Ù. -- ºÒÇàÇÏ°Ôµµ ÃÖ±ÙÀÇ ¹èÆ÷º»¿¡´Â ±× ¶óÀÎÀÌ ´Ù¸¥ STDWIN¿¡-°ü·ÃµÈ ¶óÀÎÀÇ ±Ùó¿¡ ÀÖÁö ¾Ê½À´Ï´Ù ±×·¡¼­ ±×°ÍÀ» ³õÄ¡±â ½±½À´Ï´Ù.


4.13. ÆÄÀ̽ãÀ» À§Çؼ­´Â ¾î¶² GUI µµ±¸µéÀÌ Á¸ÀçÇմϱî?

¾î¶² Ç÷§ÆûÀ» ¸ñÀûÀ¸·Î ÇÏ´À³Ä¿¡ µû¶ó¼­, ¿©·¯°¡Áö°¡ ÀÖ½À´Ï´Ù.

ÇöÀç Áö¿øµÇ´Â ÇØ°áÃ¥µéÀº:

Å©·Î½º-Ç÷§Æû(Cross-platform):

Tcl/Tk À§Á¬ ¸ðµÒ¿¡ ´ëÇÑ »ê¶æÇÑ °´Ã¼-ÁöÇâ ÀÎÅÍÆäÀ̽º°¡ Àִµ¥, Tkinter¶ó°í ºÎ¸¨´Ï´Ù. ÀÌ°ÍÀº Ç¥ÁØ ÆÄÀ̽㠹èÆ÷º»ÀÇ ÀϺημ­ Àß-Áö¿øµÇ°í ÀÖ½À´Ï´Ù -- ¿©·¯ºÐÀÌ ÇؾßÇÒ ÇÊ¿ä°¡ ÀÖ´Â ¸ðµç °ÍÀº Tcl/Tk¸¦ ±¸ÃàÇÏ°í ¼³Ä¡ÇÏ°í ±×¸®°í ÆÄÀ̽ãÀ» ±¸ÃàÇÒ ¶§ _tkinter ¸ðµâ°ú Modules/Setup¿¡ ÀÖ´Â TKPATH Á¤ÀǸ¦ »ç¿ë°¡´ÉÇÏ°Ô ÇÏ´Â °ÍÀÔ´Ï´Ù. ÀÌ°ÍÀÌ ¾Æ¸¶µµ ¼³Ä¡ÇÏ°í »ç¿ëÇϱ⿡ °¡Àå ½¬¿ì¸ç °¡Àå ¿Ïº®ÇÑ À§Á¬ ¸ðµÒÀÏ °ÍÀÔ´Ï´Ù. ¾Æ¸¶µµ ¹Ì·¡¿¡ Ç¥ÁØ ÆÄÀ̽㠱¸ÀÌ API°¡ ±âº»À¸·Î Çϰųª Àû¾îµµ Tkinter ÀÎÅÍÆäÀ̽º¿Í ´ë´ÜÈ÷ ºñ½ÁÇÏ°Ô µÉ °ÍÀÔ´Ï´Ù. Tk¿¡ °üÇÏ¿©, ¼Ò½º¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ Æ÷ÇÔÇÏ¿©, ´õ ¸¹Àº Á¤º¸°¡ ÇÊ¿äÇϽøé, http://www.scriptics.com/¿¡ ÀÖ´Â Tcl/Tk ȨÆäÀÌÁö¸¦ ÂüÁ¶Çϼ¼¿ä. Tcl/TkÀº ÀÌÁ¦ Mac°ú À©µµ¿ì Ç÷§Æû (NT¿Í 95¿¡¸¸)¿¡ ´ëÇÏ¿© ¿ÏÀüÇÑ À̽ļºÀÌ ÀÖ½À´Ï´Ù; ÇÊ¿äÇÑ °ÍÀº ÆÄÀ̽ã 1.4beta3 ÀÌ»ó ±×¸®°í Tk 4.1patch1 ÀÌ»óÀÌ ÇÊ¿äÇÕ´Ï´Ù.

wxPythonÀ̶ó°í ºÒ¸®¿ì´Â wxWindows¿¡ ´ëÇÑ ÀÎÅÍÆäÀ̽º°¡ ÀÖ½À´Ï´Ù. wxWindows´Â C++À¸·Î ÀÛ¼ºµÈ À̽ļº ÀÖ´Â ±¸ÀÌ Å¬·¡½º ¶óÀ̺귯¸®ÀÔ´Ï´Ù. GTK, Motif, MS-Windows ±×¸®°í MacÀ» ¸ñÇ¥·Î Áö¿øÇÕ´Ï´Ù. ´Ù¸¥ Ç÷§Æû¿¡ ´ëÇÑ À̽ÄÀº °í·ÁµÇ°í Àְųª ÀÌ¹Ì ¾à°£ÀÇ ÀÛ¾÷ÀÌ ÀÌ·ç¾îÁö°í ÀÖ½À´Ï´Ù. wxWindows´Â ±×·¡ÇÈ µµ±¸¸ðÀ½¿¡ ÀáÀçÇÏ´Â ½Ã°¢´À³¦À» ±×´ë·Î º¸Á¸ÇÕ´Ï´Ù, ±×¸®°í ´ë´ÜÈ÷ dzºÎÇÑ À§Á¬ ¸ðµÒ°ú GDI Ŭ·¡½º ¸ðµÒÀÌ ÀÖ½À´Ï´Ù. ´õ ¸¹Àº Á¤º¸¸¦ À§Çؼ­´Â http://www.wxwindows.org// wxWindows ÆäÀÌÁö¸¦ ÂüÁ¶Çϼ¼¿ä. wxPython´Â ÆÄÀ̽ã È®Àå ¸ðµâ·Î¼­ ¸¹Àº wxWindows C++ Ŭ·¡½ºµéÀ» Æ÷ÀåÇØÁÖ¸ç, ±×¸®°í ÆÄÀ̽㠰³¹ßÀÚµé »çÀÌ¿¡ ºü¸£°Ô Àα⸦ ¾ò°í ÀÖ½À´Ï´Ù. wxPythonÀ» ¼Ò½ºÀÇ ÇüÅ·ΠȤÀº wxWindowsÀÇ CVS ¹èÆ÷º»À¸·Î, ¶Ç´Â Á÷Á¢ http://alldunn.com/wxPython/ ȨÆäÀÌÁö¿¡¼­ ¾òÀ» ¼ö ÀÖ½À´Ï´Ù.

Á¦ÀÓ½º ÇƮ¸®Áö(James Henstridge)¿¡ ÀÇÇÑ Gnome°ú GIMP µµ±¸ ¸ðÀ½¿¡ ´ëÇÑ ¿«±â°¡ Á¸ÀçÇÕ´Ï´Ù; ´ÙÀ½À» ÂüÁ¶Çϼ¼¿ä ftp://ftp.daa.com.au/pub/james/python/.

KDE ¿«±â¸¦ À§Çؼ­´Â, ftp://ftp.kde.org/pub/kde/devel/kde-bindingsÀ» ÂüÁ¶ÇϽðųª ¶Ç´Â http://www.river-bank.demon.co.uk/software/¸¦ ÂüÁ¶Çϼ¼¿ä.

OpenGL ¿«±â¸¦ À§Çؼ­´Â, http://starship.python.net/~da/PyOpenGL¸¦ ÂüÁ¶Çϼ¼¿ä.

Ç÷§Æû Á¾¼ÓÀû:

¸Æ¿¡ ´ëÇÑ À̽ÄÀº º»·¡ÀÇ ¸Æ µµ±¸»óÀÚ È£ÃâÀ» Áö¿øÇÏ°í ÀÖ´Â ¸ðµâÀÇ ¸ðÀ½ÀÌ Ç³ºÎÇÏ¸ç °è¼ÓÇؼ­-Ä¿Áö°í ÀÖ½À´Ï´Ù. ´ÙÀ½À» ÂüÁ¶Çϼ¼¿ä ftp://ftp.python.org/pub/python/mac. Àè ¾á¼¾(Jack Jansen) jack@cwi.nlÀÌ Áö¿øÇÕ´Ï´Ù.

¸¶Å© Çظóµå(Mark Hammond)¿¡ ÀÇÇÑ ÆÄÀ̽ãÀ© (MHammond@skippinet.com.au)¿¡´Â ¸¶ÀÌÅ©·Î¼ÒÇÁÆ® ±âÃÊ Å¬·¡½º(Microsoft Foundation Classes)¿¡ ´ëÇÑ ÀÎÅÍÆäÀ̽º¿Í ÆÄÀ̽ã ÇÁ·Î±×·¡¹Ö ȯ°æÀÌ Æ÷ÇԵǾî Àִµ¥ °ÅÀÇ ´ëºÎºÐ ÆÄÀ̽ãÀ¸·Î ÀÛ¼ºµÇ¾ú½À´Ï´Ù. ´ÙÀ½À» ÂüÁ¶Çϼ¼¿ä http://www.python.org/windows/.

¸¶ÀÌÅ©·Î ¼ÒÇÁÆ® ±âÃÊ Å¬·¡½º ¸ðµ¨(MFC)¿¡ Åä´ë¸¦ µÎ´Â °´Ã¼-ÁöÇâ ±¸À̵µ Àִµ¥, WPY¶ó°í ºÎ¸£¸ç, Áü ¾Ë½ºÆ®·Ò(Jim Ahlstrom)jim@interet.comÀÌ Áö¿øÇÕ´Ï´Ù. WPY·Î ÀÛ¼ºµÈ ÇÁ·Î±×·¥Àº º¯°æ¾øÀÌ °íÀ¯ÀÇ ½Ã°¢´À³¦À» °¡Áö°í (win32s¸¦ »ç¿ëÇÏ¿©) À©µµ¿ì NT/95, À©µµ¿ì 3.1, ±×¸®°í À¯´Ð½º¿¡¼­ (Tk¸¦ »ç¿ëÇÏ¿©) ½ÇÇàµË´Ï´Ù. À©µµ¿ì¿Í ¸®´ª½º¸¦ À§ÇÑ ¼Ò½º¿Í ÀÌÁø ÆÄÀϵéÀº ftp://ftp.python.org/pub/python/wpy/¿¡¼­ ¾òÀ» ¼ö ÀÖ½À´Ï´Ù.

Æó±âµÇ°Å³ª ȤÀº ¼Ò¼öÀÇ ÇØ°áÃ¥:

X11¿¡ ´ëÇÑ ÀÎÅÍÆäÀ̽ºµµ Àִµ¥, ¾Æµ¥³ª(Athena)¿Í ¸ðƼÇÁ(Motif) À§Á¬ ¸ðµÒÀ» Æ÷ÇÔÇϸç (¸ðÀÚÀÌÅ©ÀÇ HTML À§Á¬°ú SGIÀÇ GL À§Á¬°ú °°Àº, ¾à°£ÀÇ °³ÀÎÀûÀÎ À§Á¬µé) ´ÙÀ½ÀÇ ftp://ftp.python.org/pub/python/src/X-extension.tar.gz¿¡¼­ ¾òÀ» ¼ö ÀÖ½À´Ï´Ù. ¼Åµå ¸Ö·»ÅÍ(Sjoerd Mullender)sjoerd@cwi.nl°¡ Áö¿øÇÏ°í ÀÖ½À´Ï´Ù.

X11 ÀÎÅÍÆäÀ̽º À§¿¡ ÆÞ ½ºÇʸµ(Per Spilling)¿¡ ÀÇÇÑ vpApp µµ±¸¸ðÀ½ÀÌ Àִµ¥, ÀÌÁ¦´Â ¼Åµå ¸Ö·»´õ(Sjoerd Mullender)sjoerd@cwi.nl°¡ À¯ÁöÇÏ°í ÀÖ½À´Ï´Ù. ´ÙÀ½ ftp://ftp.cwi.nl/pub/sjoerd/vpApp.tar.gzÀ» ÂüÁ¶Çϼ¼¿ä.

SGI IRIX ¸¸À» À§Çؼ­¶ó¸é, Áö¿øµÇÁö ¾Ê°í ÀÖ´Â ¿Ïº®ÇÑ GL°ú FORMS¿¡ ´ëÇÑ ÀÎÅÍÆäÀ̽º°¡ ÀÖ½À´Ï´Ù. (GL : ±×·¡ÇÈ ¶óÀ̺귯¸® -- Àú ¼öÁØÀÌÁö¸¸ ´ë´ÜÈ÷ ÈǸ¢ÇÑ 3D ´É·ÂÀ» °¡Áý´Ï´Ù) (FORMS : ¸¶Å© ¿À¹ö¸¶½º(Mark Overmars)¿¡ ÀÇÇÏ¿© GLÀ§¿¡ ±¸ÃàµÈ ¹öÆ°-°ú-½½¶óÀÌ´õ-µîµîÀÇ ÆÐÅ°Áö·Î¼­ -- ´ÙÀ½ÀÇ ftp://ftp.cs.ruu.nl/pub/SGI/FORMS/·ÎºÎÅÍ ³»·Á ¹ÞÀ» ¼ö ÀÖ½À´Ï´Ù). ÀÌ°Í ¿ª½Ã ¾Æ¸¶µµ Æó±âµÇ¾î °¡°í ÀÖ´Â ÁßÀÏ °ÍÀÔ´Ï´Ù, ÀÌÁ¦´Â OpenGLÀÌ ³Ñ°Ü ¹Þ¾Ò½À´Ï´Ù (À§¸¦ ÂüÁ¶Çϼ¼¿ä).

STDWIN¿¡ ´ëÇÑ ÀÎÅÍÆäÀ̽º°¡ Àִµ¥, Mac°ú X11À» À§ÇÑ Ç÷§Æû µ¶¸³ÀûÀÎ Àú-¼öÁØ À©µµ¿ì ÀÎÅÍÆäÀ̽º ÀÔ´Ï´Ù. ÀÌ°ÍÀº ¿ÏÀüÇÏ°Ô Áö¿øµÇÁö ¾Ê°í ÀÖÀ¸¸ç, ºü¸£°Ô Æó±âµÇ¾î °¡°í ÀÖ´Â ÁßÀÔ´Ï´Ù. STDWIN ¼Ò½º´Â ´ÙÀ½ ftp://ftp.cwi.nl/pub/stdwin/¿¡ ÀÖ½À´Ï´Ù.

WAFE¿¡ ´ëÇÑ ÀÎÅÍÆäÀ̽º°¡ Àִµ¥, X11 ¸ðƼÇÁ¿Í ¾Æµ¥³ª À§Á¬ ¸ðµÒ¿¡ ´ëÇÑ Tcl ÀÎÅÍÆäÀ̽ºÀÔ´Ï´Ù. WAFE´Â ´ÙÀ½ http://www.wu-wien.ac.at/wafe/wafe.html¿¡ ÀÖ½À´Ï´Ù.


4.14. ÆÄÀ̽㿡 µ¥ÀÌŸ º£À̽º ÆÐÅ°Áö¿¡ ´ëÇÑ ÀÎÅÍÆäÀ̽º°¡ ÀÖ³ª¿ä?

³×! ÀÚ¼¼ÇÑ »çÇ×Àº, µ¥ÀÌŸº£À̽º ÁÖÁ¦ Áöµµ¼­ (Database Topic Guide) http://www.python.org/topics/database/¸¦ ÂüÁ¶Çϼ¼¿ä.


4.15. ÆÄÀ̽ãÀ¸·Î º¹ÀâÇÑ ÇÑ-ÁÙÂ¥¸® Äڵ带 ÀÛ¼ºÇÒ ¼ö ÀÖ³ª¿ä?

±×·¸½À´Ï´Ù. ´ÙÀ½ÀÇ ¿¹Á¦ ¼¼°³¸¦ º¸¼¼¿ä, ¿ïÇÁ ¹ÙÅÚÆ®(Ulf Bartelt)ÀÇ ¹è·Á:

        # Primes < 1000
        print filter(None,map(lambda y:y*reduce(lambda x,y:x*y!=0,
        map(lambda x,y=y:y%x,range(2,int(pow(y,0.5)+1))),1),range(2,1000)))
        # First 10 Fibonacci numbers
        print map(lambda x,f=lambda x,f:(x<=1) or (f(x-1,f)+f(x-2,f)): f(x,f)
,
        range(10))
        # Mandelbrot set
        print (lambda Ru,Ro,Iu,Io,IM,Sx,Sy:reduce(lambda x,y:x+y,map(lambda y,
        Iu=Iu,Io=Io,Ru=Ru,Ro=Ro,Sy=Sy,L=lambda yc,Iu=Iu,Io=Io,Ru=Ru,Ro=Ro,i=IM,
        Sx=Sx,Sy=Sy:reduce(lambda x,y:x+y,map(lambda x,xc=Ru,yc=yc,Ru=Ru,Ro=Ro,
        i=i,Sx=Sx,F=lambda xc,yc,x,y,k,f=lambda xc,yc,x,y,k,f:(k<=0)or (x*x+y
*y
        >=4.0) or 1+f(xc,yc,x*x-y*y+xc,2.0*x*y+yc,k-1,f):f(xc,yc,x,y,k,f):chr
(
        64+F(Ru+x*(Ro-Ru)/Sx,yc,0,0,i)),range(Sx))):L(Iu+y*(Io-Iu)/Sy),range(Sy
        ))))(-2.1, 0.7, -1.2, 1.2, 30, 80, 24)
        #    \___ ___/  \___ ___/  |   |   |__ lines on screen
        #        V          V      |   |______ columns on screen
        #        |          |      |__________ maximum of "iterations"
        #        |          |_________________ range on y axis
        #        |____________________________ range on x axis
ÀÌ°ÍÀ» ½±°Ô ½ÃµµÇØ º¸Áö´Â ¸¶¼¼¿ä, ¿©·¯ºÐ!


4.16. CÀÇ "?:" »ïÁø ¿¬»êÀÚ¿Í °°Àº °ÍÀÌ ÀÖ³ª¿ä?

Á÷Á¢ÀûÀ¸·Î´Â ¾ø½À´Ï´Ù. ¸¹Àº °æ¿ì¿¡ a?b:c¸¦ "a and b or c"·Î Èä³» ³¾ ¼ö ÀÖ½À´Ï´Ù, ±×·¯³ª °áÁ¡ÀÌ ÀÖ½À´Ï´Ù: ¸¸¾à b°¡ 0À̸é (¶Ç´Â ºñ¾î Àְųª, ȤÀº None À̶ó¸é -- Å×½ºÆ®°¡ ½ÇÆÐÇÏ´Â ¾î¶² °ÍÀ̶ó¸é) ±×·¯¸é c °¡ ´ë½Å¿¡ ¼±ÅÃµÉ °ÍÀÔ´Ï´Ù. ÀÌ·¯ÇÑ ÀÏÀÌ ÀϾ ¼ö ¾ø´Â Äڵ带 »ìÆ캸¸é, ¸¹Àº °æ¿ì¿¡ Áõ¸íÇÒ ¼ö ÀÖ½À´Ï´Ù (Áï. b´Â »ó¼öÀ̰ųª Àý´ë·Î °ÅÁþÀÌ µÉ ¼ö ¾ø´Â ÇüÀ» °¡Áö±â ¶§¹®ÀÔ´Ï´Ù), ±×·¯³ª ÀϹÝÀûÀ¸·Î ÀÌ°ÍÀº ¹®Á¦°¡ µÉ ¼ö ÀÖ½À´Ï´Ù.

ÆÀ ÇÇÅͽº(Tim Peters)°¡ ´ÙÀ½ÀÇ ÇØ°áÃ¥À» Á¦½ÃÇÏ¿´½À´Ï´Ù: (a and [b] or [c])[0]. [b]´Â ½Ì±ÛÅÏ(ÇÑ°³ÀÇ ¿ä¼Ò¸¦ °¡Áö´Â) ¸®½ºÆ®À̹ǷΠÀý´ë·Î °ÅÁþÀÌ ¾Æ´Õ´Ï´Ù, ±×·¡¼­ À߸øµÈ °æ·Î´Â Àý´ë·Î ¼±ÅõÇÁö ¾Ê½À´Ï´Ù; ±×·¯¸é [0]¸¦ Àüü¿¡ Àû¿ëÇÏ¸é ½ÇÁ¦·Î ¿øÇÏ´Â b ¶Ç´Â c ¸¦ ȹµæÇÕ´Ï´Ù. ±×·¸Áö¸¸, ¾ÈŸ±õ°Ôµµ 'if'¸¦ »ç¿ëÇÏ¿© Äڵ带 ÀçÀÛ¼ºÇÏ´Â °ÍÀÌ ÁøÂ¥·Î ºÒÆíÇÏ°Ô µÇ´Â Èñ±ÍÇÑ »óȲÀ» ¸Â°Ô µË´Ï´Ù.


4.17. Ŭ·¡½º¿¡ __del__À» Á¤ÀÇÇßÁö¸¸ ±× °´Ã¼¸¦ »èÁ¦ÇÒ ¶§ È£ÃâµÇÁö ¾Ê½À´Ï´Ù.

ÀÌ°Í¿¡´Â ¿©·¯°¡Áö ÀÌÀ¯°¡ °¡´ÉÇÕ´Ï´Ù.

del ¼­¼ú¹®Àº ÇʼöÀûÀ¸·Î __del__À» È£ÃâÇÏÁö´Â ¾Ê½À´Ï´Ù -- ±×Àú ±× °´Ã¼ÀÇ ÂüÁ¶ Ƚ¼ö¸¦ °¨¼Ò½Ãų »ÓÀÔ´Ï´Ù, ±×¸®°í ¸¸¾à ±× Ƚ¼ö°¡ 0¿¡ µµ´ÞÇϸé __del__ÀÌ È£ÃâµË´Ï´Ù.

¸¸¾à µ¥ÀÌŸ ±¸Á¶°¡ ¼øȯ ¿¬°áÀ» Æ÷ÇÔÇÏ°í ÀÖ´Ù¸é (¿¹¸¦ µé¾î. °¢ ÀÚ¼ÕÀÌ ÇϳªÀÇ ºÎ¸ð Æ÷ÀÎÅ͸¦ °¡Áö°í ÀÖ°í °¢ ºÎ¸ð´Â ÀÚ¼Õ ¸ñ·ÏÀ» °¡Áö°í ÀÖ´Â Æ®¸® ±¸Á¶ÀÇ °æ¿ì¶ó¸é) ±× ÂüÁ¶ Ƚ¼ö´Â Àý´ë·Î 0À¸·Î µÇµ¹¾Æ °¡Áö ¾ÊÀ» °ÍÀÔ´Ï´Ù. ¸í½ÃÀûÀ¸·Î close() ¸Þ½îµå¸¦ Á¤ÀÇÇÏ¿© ±×·¯ÇÑ Æ÷ÀÎÅ͵éÀ» Á¦°ÅÇؾ߸¸ ÇÒ °ÍÀÔ´Ï´Ù. Á¦¹ß __del__À» Á÷Á¢ÀûÀ¸·Î È£ÃâÇÏÁö ¸¶¼¼¿ä -- __del__Àº close()¸¦ È£ÃâÇؾ߸¸ ÇÏ°í close()´Â ÀÚ½ÅÀÌ °°Àº °´Ã¼¿¡ ´ëÇÏ¿© ÇÑ ¹ø ÀÌ»ó È£ÃâµÉ ¼ö ÀÖµµ·Ï È®ÀÎÇÏ¿©¾ß¸¸ ÇÕ´Ï´Ù.

¸¸¾à ±× °´Ã¼°¡ except Àý¿¡¼­ Ç¥Çö½ÄÀ» ³ªÆ÷ÇÏ´Â ÇÔ¼ö¿¡ ´ëÇÑ Áö¿ª º¯¼ö¿´´Ù¸é (ȤÀº Àμö¶ó¸é, ÀÌ°ÍÀº ½ÇÁ¦ÀûÀ¸·Î °°Àº °ÍÀÔ´Ï´Ù), °¡´É¼ºÀº ±× °´Ã¼¿¡ ´ëÇÑ ÂüÁ¶°¡ ½ºÅà ÃßÀû¿¡¼­ ´ã°Ü ÀÖ´Â ±×´ë·Î ¿©ÀüÈ÷ ±× ÇÔ¼öÀÇ ½ºÅà ÇÁ·¹ÀÓ¿¡ Á¸ÀçÇÏ´Â °ÍÀÔ´Ï´Ù. º¸Åë, (´õ ÁÁÀº °ÍÀº: NoneÀ» ÇÒ´çÇÏ´Â °Í) sys.exc_traceback À» »èÁ¦Çϸé ÀÌ°ÍÀ» ÇØ°áÇØ ÁÙ °ÍÀÔ´Ï´Ù. ¸¸¾à »óÈ£´ëÈ­ÀûÀÎ ÀÎÅÍÇÁ¸®ÅÍ »óÅ¿¡¼­ 󸮵ÇÁö ¾ÊÀº ¿¹¿Ü¿¡ ´ëÇÏ¿© ½ºÅÃÀÌ Ãâ·ÂµÇ¸é, ´ë½Å¿¡ sys.last_tracebackÀ» Áö¿ì¼¼¿ä.

ÀÎÅÍÇÁ¸®ÅÍ°¡ Á¾·áÇÒ ¶§ ¸ðµç °´Ã¼¸¦ »èÁ¦ÇÏ´Â Äڵ尡 ÀÖÁö¸¸, ÆÄÀ̽ãÀÌ ¾²·¹µå¸¦ Áö¿øÇϵµ·Ï ȯ°æ¼³Á¤µÇ¾î ÀÖ´Ù¸é È£ÃâµÇÁö ¾Ê½À´Ï´Ù (¿Ö³ÄÇÏ¸é ´Ù¸¥ ¾²·¹µåµéÀÌ ¿©ÀüÈ÷ »ì¾ÆÀÖÀ»Áöµµ ¸ð¸£±â ¶§¹®ÀÔ´Ï´Ù). ÀڽŸ¸ÀÇ Ã»¼Ò ÇÔ¼ö¸¦ sys.exitfunc¸¦ »ç¿ëÇÏ¿© ÀÛ¼ºÇÒ ¼ö ÀÖ½À´Ï´Ù (Áú¹® 4.4 ÂüÁ¶).

¸¶Áö¸·À¸·Î, __del__ ¸Þ½îµå°¡ ¿¹¿Ü¸¦ ÀÏÀ¸Å°¸é, °æ°í ¸Þ½ÃÁö°¡ sys.stderr¿¡ Ãâ·ÂµË´Ï´Ù.

ÆÄÀ̽ã 2.0ºÎÅÍ´Â, ¾²·¹±â ¼öÁý±â´Â ¸¹Àº ¼øȯ°í¸®°¡ ¿ÜºÎ ÂüÁ¶¾øÀÌ »ç¿ëÇÑ °ø°£À» Àç¿ä±¸ÇÒ ¼ö ÀÖ½À´Ï´Ù. ±×·¸Áö¸¸, ½ÇÆа¡ ¿¹»óµÇ´Â º´¸®Àû »ç·Ê°¡ Á¸ÀçÇÒ °¡´É¼ºÀÌ ÀÖ½À´Ï´Ù, ±×·¡¼­ ¿©·¯ºÐÀÇ ÇÁ·Î±×·¥ÀÌ ±×·¯ÇÑ ¼øȯ°í¸®¸¦ ±ü´Ù´Â °ÍÀ» È®ÀÎÇÏ´Â °ÍÀÌ Ç×»ó °¡Àå ¾ÈÀüÇÕ´Ï´Ù.

Áú¹® 6.14ÀÇ ¸ñÀûÀº »õ·Î¿î ¾²·¹±â ¼öÁý ¾Ë°í¸®ÁòÀ» ¼³¸íÇÏ´Â °ÍÀÔ´Ï´Ù.


4.18. os.popen() ¶Ç´Â os.system()À» »ç¿ëÇÏ¿© È£ÃâµÇ´Â ÇÁ·Î±×·¥µéÀ» À§ÇÑ ½© ȯ°æÀ» ¾î¶»°Ô º¯°æÇϳª¿ä? os.environÀ» º¯°æÇÏ´Â °ÍÀÌ ÀÛµ¿ÇÏÁö ¾Ê¾Æ¿ä.

Ʋ¸²¾øÀÌ ÆÄÀ̽ã 1.4 ÀÌÀü ¹öÀüÀ» »ç¿ëÇÏ°í Àְųª putenv() ¶óÀ̺귯¸® ÇÔ¼ö¸¦ °¡Áö°í ÀÖÁö ¾ÊÀº (¾ÆÁÖ Èñ±ÍÇÑ) ½Ã½ºÅÛÀ» »ç¿ëÇÏ°í ÀÖ½À´Ï´Ù.

ÆÄÀ̽ã 1.4 ÀÌÀü¿¡¼­´Â, ÇϺν©·Î °Ç³×Áö´Â ȯ°æÀ» º¯°æÇÏ´Â °ÍÀÌ ±× ÀÎÅÍÇÁ¸®ÅÍ¿¡¼­´Â »ý·«µÇ¾ú½À´Ï´Ù. ±×·¸°Ô ÇϱâÀ§ÇÑ Àß-±¸ÃàµÈ ÀÌ½Ä ¹æ¹ýÀÌ ¾ø´Ù°í ÆÇ´Ü µÇ¾ú±â ¶§¹®ÀÔ´Ï´Ù (ƯÈ÷, ¾î¶² ½Ã½ºÅÛÀº, putenv()¸¦ °¡Áö°í, ´Ù¸¥ ½Ã½ºÅÛµéÀº setenv()¸¦ °¡Áö¸ç, ±×¸®°í ¾î¶² ½Ã½ºÅÛµéÀº ÀüÇô °¡ÁöÁö ¾Ê½À´Ï´Ù). ÆÄÀ̽ã 1.4 ÇöÀçºÎ·Î, °ÅÀÇ ¸ðµç À¯´Ð½º ½Ã½ºÅÛÀº putenv()¸¦ °¡Áö°í ÀÖ½À´Ï´Ù ±×¸®°í Win32 APIµµ °¡Áö°í ÀÖ°í, ±×·±½ÄÀ¸·Î os ¸ðµâÀº º¯°æµÇ¾î os.environ¿¡ ´ëÇÑ º¯°æÀº ³ªÆ÷µÇ°í ±× »óÀÀÇÏ´Â putenv() È£ÃâÀÌ ÀÌ·ç¾îÁý´Ï´Ù.


4.19. Ŭ·¡½º°¡ ¹«¾ùÀΰ¡¿ä?

Ŭ·¡½º¶õ Ưº°ÇÑ °´Ã¼ ÇüÀ¸·Î¼­ class ¼­¼ú¹®À» ½ÇÇàÇÏ¸é ¸¸µé¾îÁý´Ï´Ù. Ŭ·¡½º °´Ã¼´Â ÀӽÿøÇü(ÅÛÇø®Æ®)·Î »ç¿ëµÇ¾î, Ŭ·¡½º ½Çü °´Ã¼¸¦ ¸¸µå´Âµ¥, ±×°ÍÀº µ¥ÀÌŸ ±¸Á¶¿Í µ¥ÀÌŸ Çü¿¡ Á¾¼ÓÀûÀÎ ÇÁ·Î±×·¥ ·çƾ ¸ðµÎ¸¦ ±¸Ã¼È­ÇÕ´Ï´Ù.


4.20. ¸Þ½îµå¶õ ¹«¾ùÀΰ¡¿ä?

¸Þ½îµå´Â ÇÔ¼ö·Î¼­ º¸Åë ¾î¶² °´Ã¼ x¿¡ ´ëÇÏ¿© x.name(arguments...)°ú °°ÀÌ È£ÃâÇÕ´Ï´Ù. ±× ¿ë¾î´Â Ŭ·¡½º¿Í Ŭ·¡½º ½ÇüÀÇ ¸Þ½îµå¿¡µµ »ç¿ëµÇ¾îÁö°í ³»Àå °´Ã¼ÀÇ ¸Þ½îµå¿¡µµ »ç¿ëµË´Ï´Ù. (ÈÄÀÚ´Â ¿ÏÀüÇÏ°Ô ´Ù¸¥ ±¸ÇöÀ» °¡Áö¸ç ÆÄÀ̽ã Äڵ忡¼­ È£Ãâ ¹æ½ÄÀÇ ÇüŸ¸À» °øÀ¯ÇÕ´Ï´Ù.) Ŭ·¡½ºÀÇ ¸Þ½îµå (±×¸®°í Ŭ·¡½º ½ÇüÀÇ ¸Þ½îµå)´Â class Á¤ÀǾȿ¡¼­ ÇÔ¼ö·Î Á¤Àǵ˴ϴÙ.


4.21. self¶õ ¹«¾ùÀԴϱî?

Self´Â ´Ü¼øÈ÷ ÇÑ ¸Þ½îµåÀÇ Ã¹ ¹ø° Àμö¿¡ ´ëÇÑ °ü·ÊÀûÀÎ À̸§ÀÏ »ÓÀÔ´Ï´Ù -- Áï. Ŭ·¡½º Á¤ÀÇ ¾È¿¡ Á¤ÀÇµÈ ÇÔ¼öÀÔ´Ï´Ù. meth(self, a, b, c)¶ó°í Á¤ÀÇµÈ ¸Þ½îµå´Â ±× Ŭ·¡½ºÀÇ ½Çü x¿¡ ´ëÇÏ¿© x.meth(a, b, c)·Î È£ÃâµÇ¾î¾ß¸¸ ÇÕ´Ï´Ù; ±× Á¤ÀÇ°¡ ³ªÅ¸³ª´Â Ŭ·¡½ºÀÇ ¾î¶² ½Çü¿¡ ´ëÇؼ­, ±× È£ÃâµÈ ¸Þ½îµå´Â meth(x, a, b, c)·Î È£ÃâµÈ °ÍÀ̶ó°í »ý°¢ÇÒ °ÍÀÔ´Ï´Ù.


4.22. ¿«¿©ÁöÁö ¾ÊÀº ¸Þ½îµå¶õ ¹«¾ùÀԴϱî?

¿«¿©ÁöÁö ¾ÊÀº ¸Þ½îµå¶õ, ¾ÆÁ÷ ½Çü¿¡ ¿«¿©ÁöÁö ¾ÊÀº Ŭ·¡½º¿¡ Á¤ÀÇµÈ ¸Þ½îµåÀÔ´Ï´Ù. Ŭ·¡½º ¼Ó¼ºÀ» ¿ä±¸Çϸé (Ŭ·¡½º ¼Ó¼ºÀº ÇÔ¼ö°¡ µÉ ¼ö ÀÖ½À´Ï´Ù), ¿«¿©ÁöÁö ¾ÊÀº ¸Þ½îµå¸¦ ¾ò½À´Ï´Ù. ½Çü ¼Ó¼ºÀ» ¿ä±¸ÇÏ¸é ¿«ÀÎ ¸Þ½îµå¸¦ ȹµæÇÕ´Ï´Ù. ¿«¿©Áø ¸Þ½îµå´Â ¾î¶² ½Çü¿¡ ¼ÓÇÏ´ÂÁö¸¦ ¾Ë°í ÀÖÀ¸¸ç ±×°ÍÀ» È£ÃâÇÏ¸é ±× ½Çü¸¦ ÀÚµ¿ÀûÀ¸·Î °ø±ÞÇØ ÁÝ´Ï´Ù; ¿«¿©ÁöÁö ¾ÊÀº ¸Þ½îµå´Â ¿ÀÁ÷ ±×ÀÇ Ã¹¹ø° Àμö·Î ¾î¶² Ŭ·¡½º°¡ ÇÊ¿äÇÑÁö¸¸À» ¾Ë°í ÀÖÀ» »ÓÀÔ´Ï´Ù (ÆÄ»ýµÈ Ŭ·¡½º ¿ª½Ã ¸¶Âù°¡ÁöÀÔ´Ï´Ù). ¿«¿©ÁöÁö ¾ÊÀº ¸Þ½îµå¸¦ È£ÃâÇÏ¸é ±× ¹®¸ÆÀ¸·ÎºÎÅÍ Ã¹ ¹ø° Àμö¸¦ "¸¶¹ýÀûÀ¸·Î" ÆÄ»ý½ÃÅ°Áö´Â ¾Ê½À´Ï´Ù -- ¸í½ÃÀûÀ¸·Î ±×°ÍÀ» Á¦°øÇÒ ÇÊ¿ä°¡ ÀÖ½À´Ï´Ù.

¿«¿©ÁöÁö ¾ÊÀº ¸Þ½îµå¿¡ °üÇÑ ¾à°£ÀÇ ÁÖÀÇ»çÇ×: ƯÁ¤ÇÑ °´Ã¼ÀÇ ¿«¿©ÁöÁö ¾ÊÀº ¸Þ½îµå¸¦ ÂüÁ¶ÇÒ ¶§¸¶´Ù ¿«¿©ÁöÁö ¾ÊÀº ¸Þ½îµå °´Ã¼¸¦ ¸¸µé¾î ³À´Ï´Ù. ¸¸¾à ´ÙÀ½°ú °°ÀÌ ÂüÁ¶ÇÑ´Ù¸é (a = inst.meth; b = inst.meth), ±×µéÀº µ¿µîÇϱâ´Â ÇÏÁö¸¸ (a == b) µ¿ÀÏÇÏÁö´Â ¾ÊÀ» °ÍÀÔ´Ï´Ù (a is not b).


4.23. ±âº» Ŭ·¡½º¿¡ Á¤ÀÇµÈ Á¤ÀÇµÈ ¸Þ½îµå¸¦ ±×°ÍÀ» µ¤¾î¾²´Â ÆÄ»ýŬ·¡½º·ÎºÎÅÍ ¾î¶»°Ô È£ÃâÇϳª¿ä?

¸¸¾à Ŭ·¡½º Á¤ÀÇ°¡ "class Derived(Base): ..."·Î ½ÃÀÛÇÑ´Ù¸é Base Ŭ·¡½º (ȤÀº BaseÀÇ ±âº» Ŭ·¡½º)¿¡ Á¤ÀÇµÈ ¸Þ½îµå¸¦ Base.meth(self, arguments...)¿Í °°ÀÌ È£ÃâÇÒ ¼ö ÀÖ½À´Ï´Ù. ¿©±â¿¡¼­, Base.meth´Â ¿«¿©ÁöÁö ¾ÊÀº ¸Þ½îµåÀÔ´Ï´Ù (ÀÌÀüÀÇ Áú¹®À» ÂüÁ¶).


4.24. ±âº» Ŭ·¡½º·ÎºÎÅÍ ¸Þ½îµå¸¦ ±× ±âº» Ŭ·¡½ºÀÇ À̸§À» »ç¿ëÇÏÁö ¾Ê°í ¾î¶»°Ô È£ÃâÇϳª¿ä?

ÀÌ·¸°Ô ÇÏÁö ¸¶¼¼¿ä. ÁøÂ¥ÀÔ´Ï´Ù. Áø½ÉÀ¸·Î µå¸®´Â ¸»¾¸ÀÔ´Ï´Ù. ¸¶Ä¡ self.__class__.__bases__[0].meth(self, arguments...)¸¦ È£ÃâÇÒ ¼ö ÀÖ´Â µíÀÌ º¸ÀÌÁö¸¸, ÀÌ°ÍÀº ÀÌÁßÀ¸·Î-ÆÄ»ýµÈ ¸Þ½îµå°¡ ¿©·¯ºÐÀÇ Å¬·¡½º·ÎºÎÅÍ ÆÄ»ýµÉ ¶§ ½ÇÆÐÇÕ´Ï´Ù: ½Çüµé¿¡ ´ëÇÏ¿©, self.__class__.__bases__[0]´Â Ŭ·¡½ºÀÌÁö, ±×ÀÇ ±âº» Ŭ·¡½º°¡ ¾Æ´Õ´Ï´Ù -- ±×·¡¼­ (¿©·¯ºÐÀÌ Derived.meth¾ÈÀ¸·ÎºÎÅÍ ÀÌ·¸°Ô ÇÑ´Ù°í °¡Á¤ÇÑ´Ù¸é) Àç±Í È£ÃâÀ» ½ÃÀÛÇÒ °ÍÀÔ´Ï´Ù.

ÀÌ·¸°Ô Çϱ⸦ ¿øÇÒ ¶§ °¡²û ¿©·¯ºÐÀº Ŭ·¡½ºµéÀÌ ÆÄÀ̽㿡¼­ Á¦ÀÏ Å¬·¡½º¶ó´Â °ÍÀ» Àؾî¹ö¸³´Ï´Ù. ½Çü ¼öÁØ È¤Àº ÇϺÎŬ·¡½º ¼öÁØ¿¡¼­, Ŭ·¡½º¸¦ ÁöÁ¤ÇÏ¿© ¿¬»êÀ» À§ÀÓÇÒ ¼ö ÀÖ½À´Ï´Ù. ¿¹¸¦ µé¾î superclassÀÇ "glorp" ¿¬»êÀ» »ç¿ëÇÏ·Á¸é Á¤È®ÇÑ superclass¸¦ ÁöÀûÇؼ­ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù.

  class subclass(superclass1, superclass2, superclass3):
      delegate_glorp = superclass2
      ...
      def glorp(self, arg1, arg2):
            ... subclass specific stuff ...
            self.delegate_glorp.glorp(self, arg1, arg2)
       ...
  class subsubclass(subclass):
       delegate_glorp = superclass3
       ...
±×·¸Áö¸¸, ÁÖÀÇÇϼ¼¿ä. subsubclass¿¡¼­ ÇϺÎŬ·¡½ºÈ­ Çϱâ À§Çؼ­ delegate_glorp¸¦ ¼³Á¤Çϸé subclass.delegate_glorp¿¡ ´ëÇÏ¿© ¹«ÇÑ Àç±Í¸¦ ¾ß±âÇÒ °ÍÀÔ´Ï´Ù. ÁÖÀÇ Çϼ¼¿ä! ¾Æ¸¶µµ ÀڽŸ¸ÀÇ ¸ñÀûÀ» À§ÇØ ³Ê¹« ±âºÐÀ» ³»°í ÀÖ´ÂÁöµµ ¸ð¸¨´Ï´Ù. µðÀÚÀÎÀ» °£°áÇÏ°Ô ÇÏ´Â °ÍÀ» °í·ÁÇØ º¸¼¼¿ä (?).


4.25. ¾î¶»°Ô ³ªÀÇ Äڵ带 Á¶Á÷ÇÏ¿© ±âº» Ŭ·¡½º¸¦ ´õ ½±°Ô º¯°æÇϵµ·Ï ÇÒ ¼ö ÀÖ³ª¿ä?

±× ±âº» Ŭ·¡½º¿¡ ´ëÇÏ¿© º°¸íÀ» Á¤ÀÇÇÒ ¼ö ÀÖÀ¸¸ç, ½ÇÁ¦ ±âº» Ŭ·¡½º¸¦ Ŭ·¡½º Á¤ÀÇ Àü¿¡ °Å±â¿¡ ÇÒ´çÇÏ°í, ±×¸®°í ±× º°¸íÀ» Àüü Ŭ·¡½º¿¡ °ÉÃļ­ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. ±×·¯¸é º¯°æÇؾßÇÒ °ÍÀº ¿ÀÁ÷ ±× º°¸í¿¡ ÇÒ´çµÈ °ªÀÔ´Ï´Ù. ¿ì¿¬ÇÏ°Ô, ÀÌ ²Ä¼ö´Â ¾î¶² ±âº» Ŭ·¡½º¸¦ »ç¿ëÇÒÁö (¿¹¸¦ µé¾î, ÀÚ¿øÀÇ »ç¿ë°¡´É¼º¿¡ µû¶ó¼­) µ¿ÀûÀ¸·Î °áÁ¤Çϱ⸦ ¿øÇÒ ¶§¿¡µµ À¯¿ëÇÕ´Ï´Ù. ¿¹¸¦ µé¾î:

        BaseAlias = <real base class>
        class Derived(BaseAlias):
                def meth(self):
                        BaseAlias.meth(self)
                        ...


4.26. ÇÑ °´Ã¼ÀÇ ¼Ó¼º ȤÀº ¸Þ½îµå¸¦ ¾î¶»°Ô ¾Ë ¼ö ÀÖ³ª¿ä?

ÀÌ°ÍÀº ±× °´Ã¼ÀÇ Çü¿¡ µû¶ó ´Ù¸¨´Ï´Ù.

»ç¿ëÀÚ-Á¤ÀÇ Å¬·¡½ºÀÇ ½Çü x¿¡ ´ëÇÏ¿©, ½Çü ¼Ó¼ºÀº »çÀü x.__dict__¿¡¼­ ¹ß°ßÇÒ ¼ö ÀÖÀ¸¸ç, ±×¸®°í ±×ÀÇ Å¬·¡½º¿¡ ÀÇÇؼ­ Á¤ÀÇµÈ ¸Þ½îµå¿Í ¼Ó¼ºµéÀº x.__class__.__bases__[i].__dict__¿¡¼­ ¹ß°ßµË´Ï´Ù (for i in range(len(x.__class__.__bases__))). ¸ðµç Ŭ·¡½º ¸Þ½îµå¿Í ¼Ó¼ºµéÀ» ãÀ¸·Á¸é ±âº» Ŭ·¡½ºµéÀÇ Æ®¸®¸¦ Ž»öÇÒ ÇÊ¿ä°¡ ÀÖ½À´Ï´Ù.

´Ù¼öÀ̱â´Â ÇÏÁö¸¸, ¸ðµç ³»Àå ÇüµéÀÌ ¸Þ½îµå À̸§µéÀ» x.__methods__¿¡ Á¤ÀÇÇÏ´Â °ÍÀº ¾Æ´Õ´Ï´Ù, ±×¸®°í ¸¸¾à µ¥ÀÌŸ ¼Ó¼ºµéÀ» °¡Áö¸é, ±× À̸§µéÀº x.__members__¿¡¼­ ¹ß°ßµÉ ¼ö ÀÖ½À´Ï´Ù. ±×·¸Áö¸¸ ÀÌ°ÍÀº °ü·ÊÀÏ µû¸§ÀÔ´Ï´Ù.

Á¤º¸°¡ ´õ ÇÊ¿äÇϽøé, Ç¥ÁØ (±×·¯³ª ¹®¼­È­µÇÁö ¾ÊÀº) ¸ðµâ newdirÀÇ ¼Ò½º¸¦ ÀÐ¾î º¸¼¼¿ä.


4.27. os.popen()À¸·Î »ý¼ºµÈ ÆÄÀÌÇÁ¿¡¼­ os.read()¸¦ »ç¿ëÇÒ ¼ö ¾ø´Â °Í °°½À´Ï´Ù.

os.read()´Â Àú-¼öÁØ ÇÔ¼ö·Î¼­ ÆÄÀÏ ±â¼úÀÚ¸¦ ÃëÇÕ´Ï´Ù (ÀÛÀº Á¤¼ö). os.popen()´Â °í-¼öÁØ ÆÄÀÏ °´Ã¼¸¦ »ý¼ºÇÕ´Ï´Ù -- sys.std{in,out,err}¿¡ »ç¿ëµÇ°í ³»Àå open()ÇÔ¼ö¿¡ ÀÇÇÏ¿© ¹ÝȯµÇ´Â °Í°ú °°Àº ÇüÀÔ´Ï´Ù. ±×¸®ÇÏ¿©, os.popen()À¸·Î »ý¼ºµÈ ÆÄÀÌÇÁ p·ÎºÎÅÍ n ¹ÙÀÌÆ®¸¦ ÀÐÀ¸·Á¸é, p.read(n)À» »ç¿ëÇÒ ÇÊ¿ä°¡ ÀÖ½À´Ï´Ù.


4.28. ÆÄÀ̽㠽ºÅ©¸³Æ®¸¦ ¾î¶»°Ô µ¶¸³ÀûÀÎ ÀÌÁø ÆÄÀÏ·Î ¸¸µé ¼ö ÀÖ³ª¿ä?

"Tools/freeze/"¿¡ ÀÖ´Â "freeze" µµ±¸°¡ ¿øÇÏ´Â ¹Ù¸¦ ÇØ ÁÝ´Ï´Ù. README¸¦ ÂüÁ¶Çϼ¼¿ä.

ÀÌ°ÍÀº ´ÙÀ½°ú °°ÀÌ ÀÛµ¿ÇÕ´Ï´Ù. ¼Ò½º¸¦ Àç±ÍÀûÀ¸·Î Äf¾î¼­ ¼öÀÔ ¼­¼ú¹®µéÀ» Ž»öÇÏ°í ±×¸®°í Ç¥ÁØ ÆÄÀ̽㠰æ·Î¿¡ ÀÖ´Â ¸ðµâµé°ú (³»Àå ¸ðµâÀ» À§ÇÑ) ¼Ò½º µð·ºÅ丮¿¡ ÀÖ´Â ¸ðµâµéÀ» ã½À´Ï´Ù. ±×¸®°í³ª¼­ ±×°ÍÀº ÆÄÀ̽ãÀ¸·Î ÀÛ¼ºµÈ ¸ðµâÀ» C ÄÚµå·Î ( marshal ¸ðµâÀ» »ç¿ëÇÏ¿© ÄÚµå °´Ã¼·Î º¯°æµÉ ¼ö ÀÖ´Â ¹è¿­ ÃʱâÈ­ÀÚ·Î) "ÄÄÆÄÀÏ ÇÕ´Ï´Ù" ±×¸®°í °í°´-¸ÂÃã ȯ°æ¼³Á¤ ÆÄÀÏÀ» ¸¸µå´Âµ¥ ±× ÇÁ·Î±×·¥¿¡¼­ ½ÇÁ¦ÀûÀ¸·Î »ç¿ëµÇ´Â ³»Àå ÇÔ¼öµé ¸¸À» ´ã°í ÀÖ½À´Ï´Ù. ±×¸®°í ³ª¼­ »ý¼ºµÈ C Äڵ带 ÄÄÆÄÀÏÇÏ°í ±×°ÍÀ» ÆÄÀ̽ã ÀÎÅÍÇÁ¸®ÅÍÀÇ ³ª¸ÓÁö¿Í ¿¬°áÇÏ¿© ½ºÅ©¸³Æ®¿Í Á¤È®ÇÏ°Ô ¶È °°ÀÌ ÇൿÇÏ´Â, ÀÚ½ÅÀÌ-´ã°ÜÁø ÀÌÁø ÆÄÀÏÀ» Çü¼ºÇÕ´Ï´Ù.

ÈùÆ®: freeze ÇÁ·Î±×·¥Àº ½ºÅ©¸³Æ®ÀÌ ÆÄÀÏÀ̸§ÀÌ ".py"·Î ³¡³¯ ¶§¸¸ ÀÛµ¿ÇÕ´Ï´Ù.

À©µµ¿ì¿¡¼­ ÀÌ·¸°Ô Çϱ⸦ ¿øÇÑ´Ù¸é, µÎ °³ÀÇ À¯Æ¿¸®Æ¼°¡ µµ¿òÀÌ µÉ °ÍÀÔ´Ï´Ù. ù°´Â ´ÙÀ½ÀÇ °íµç ¸Æ¹Ð¶õ(Gordon McMillan)ÀÇ ¼³Ä¡±â ÀÔ´Ï´Ù.

    http://starship.python.net/crew/gmcm/install.html
±×¸®°í µÑ °´Â ´ÙÀ½ÀÇ Å丶½º Çï·¯(Thomas Heller)ÀÇ py2exeÀÔ´Ï´Ù

    http://starship.python.net/crew/theller/py2exe/
ÈÄÀÚÀÇ µµ±¸´Â ¿©ÀüÈ÷ °³¹ßÁßÀÔ´Ï´Ù, ±×·¯³ª ÀÌ¹Ì ÆÄÀ̽ã COM ¼­¹ö¸¦ À§Çؼ­ µ¶¸³ÀûÀÎ .exe ÆÄÀÏÀ» ¸¸µå´Âµ¥ »ç¿ëµÇ¾î ¿Ô½À´Ï´Ù.


4.29. ÆÄÀ̽ãÀ» À§Çؼ­ ¾î¶² WWW µµ±¸µéÀÌ ÀÖ³ª¿ä?

¶óÀ̺귯¸® ÂüÁ¶ ¸Å´º¾ó¿¡ ÀÖ´Â ´ÙÀ½ Àå "ÀÎÅÍ³Ý ÇÁ·ÎÅäÄÝ°ú Áö¿ø(Internet Protocols and Support)"°ú "ÀÎÅÍ³Ý µ¥ÀÌŸ ó¸®(Internet Data Handling)"¶ó°í Á¦¸ñÀÌ ºÙ¿©Áø ÀåÀ» ÂüÁ¶Çϼ¼¿ä. ÆÄÀ̽ãÀº ¼­¹ö-ÂÊ°ú Ŭ¶óÀ̾ðÆ®-ÂÊ À¥ ½Ã½ºÅÛÀ» ±¸ÃàÇϴµ¥ µµ¿òÀ» ÁÖ´Â ÈǸ¢ÇÑ °Íµé·Î °¡µæÇÕ´Ï´Ù.

ÆÄÀ̽ãÀÇ À¥ ÇÁ·¹ÀÓ¿öÅ©¿¡ °ü½ÉÀÌ ÀÖÀ¸½Ã¸é, ´ÙÀ½ÀÇ ÈǸ¢ÇÑ »çÀÌÆ®¸¦ ¹æ¹®ÇØ º¸¼¼¿ä

    http://groups.yahoo.com/group/python-web-modules.
ÆÄÀ̽ãÀ¸·Î ÀÛ¼ºµÈ À¥ ºê¶ó¿ìÀúµµ Àִµ¥, GrailÀ̶ó°í ºÎ¸¨´Ï´Ù -- ´ÙÀ½ http://grail.cnri.reston.va.us/grail/À» ÂüÁ¶Çϼ¼¿ä. ±×·¸Áö¸¸, ÃÖ±Ù ¸î³âµ¿¾È¿¡ ÀÌ Äڵ尡 ¾ó¸¶³ª ¸¹ÀÌ À¯Áö º¸¼ö µÇ¾ú´ÂÁö´Â ¸ð¸£°Ú½À´Ï´Ù.


4.30. ÀԷ°ú Ãâ·Â ¾çÂÊ¿¡ ¿¬°áµÈ ÆÄÀÌÇÁ·Î ¾î¶»°Ô ÇϺÎÇÁ·Î¼¼½º¸¦ ½ÇÇàÇϳª¿ä?

Ç¥ÁØ popen2 ¸ðµâÀ» »ç¿ëÇϼ¼¿ä. ¿¹¸¦ µé¾î:

	import popen2
	fromchild, tochild = popen2.popen2("command")
	tochild.write("input\n")
	tochild.flush()
	output = fromchild.readline()
°æ°í: ÀϹÝÀûÀ¸·Î, ÀÌ·¸°Ô ÇÏ´Â °ÍÀº Çö¸íÇÏÁö ¸øÇÕ´Ï´Ù, ¿Ö³ÄÇÏ¸é ½±°Ô µ¥µå¶ôÀ» ¾ß±âÇÒ ¼ö Àֱ⠶§¹®Àε¥ ¿©·¯ºÐÀº ÀÚ¼Õ ÇÁ·Î¼¼½º·ÎºÎÅÍ Ãâ·ÂÀ» ±â´Ù¸®¸é¼­ Á¤ÁöÇÏ°í ÀÖ´Â µ¿¾È¿¡, ÀÚ¼Õ ÇÁ·Î¼¼½º´Â ¿©·¯ºÐÀ¸·ÎºÎÅÍ ÀÔ·ÂÀ» ±â´Ù¸®¸é¼­ Á¤ÁöÇÏ°í ÀÖ°Ô µË´Ï´Ù. ÀÌ°ÍÀº ÀÚ¼Õ ÇÁ·Î¼¼½º°¡ Ãâ·ÂÇÏ´Â °Íº¸´Ù ´õ ¸¹Àº ÅؽºÆ®¸¦ Ãâ·ÂÇϱ⸦ ºÎ¸ð ÇÁ·Î¼¼½º°¡ ¿¹»óÇÏ°í Àֱ⠶§¹®¿¡ ¾ß±âµÉ ¼ö µµ ÀÖ°í, ¶Ç´Â µ¥ÀÌŸ°¡ °­Á¦ ¾²±â(flushing)°¡ °á¿©µÇ¾î, stdio ¹öÆÛ¿¡ °íÂøµÇ¾î Àֱ⠶§¹®¿¡ ¾ß±âµÉ ¼öµµ ÀÖ½À´Ï´Ù. ¹°·Ð ÆÄÀ̽㠺θð ÇÁ·Î¼¼½º´Â ¸ðµç ¾î¶² Ãâ·ÂÀ̵çÁö Àбâ Àü¿¡ ÀÚ¼Õ¿¡°Ô º¸³»´Â µ¥ÀÌŸ¸¦ ¸í½ÃÀûÀ¸·Î °­Á¦¾²±âÇÒ ¼ö ÀÖ½À´Ï´Ù, ±×·¯³ª ÀÚ¼Õ ÇÁ·Î¼¼½º°¡ ¿ø·¡ C ÇÁ·Î±×·¥À̶ó¸é, °­Á¦¾²±â´Â º¸Åë ÀÚµ¿ÀûÀ̹ǷÎ, »óÈ£´ëÈ­ÀûÀÏ Áö¶óµµ, ¸í½ÃÀûÀ¸·Î ±× Ãâ·ÂÀ» °­Á¦¾²±â ÇÏÁö ¾Êµµ·Ï ½±°Ô ÀÛ¼ºµÇ¾îÁú ¼ö ÀÖ½À´Ï´Ù

popen2¿¡ ÀÖ´Â ¹ö±×¿¡ ´ëÇÑ ÁÖÀÇ»çÇ×: ¿©·¯ºÐÀÇ ÇÁ·Î±×·¥ÀÌ wait() ȤÀº waitpid()¸¦ È£ÃâÇÏÁö ¾Ê´Â ÇÑ, ¿Ï°áµÈ ÀÚ¼Õ ÇÁ·Î¼¼½º´Â Àý´ë·Î Á¦°ÅµÇÁö ¾Ê½À´Ï´Ù, ±×¸®°í °á±¹ popen2¸¦ È£ÃâÇÏ´Â °ÍÀº ÀÚ¼Õ ÇÁ·Î¼¼½ºÀÇ °³¼ö Á¦ÇÑ ¶§¹®¿¡ ½ÇÆÐÇÒ °ÍÀÔ´Ï´Ù. os.WNOHANG ¼±ÅûçÇ×À» °¡Áö°í os.waitpid¸¦ È£ÃâÇϸé ÀÌ°ÍÀ» ¹æÁöÇÒ ¼ö ÀÖ½À´Ï´Ù; ±×·¯ÇÑ È£ÃâÀ» »ðÀÔÇϱâ À§ÇÑ ÃÖÀû Àå¼Ò´Â popen2¸¦ ´Ù½Ã È£ÃâÇϱâ ÀüÀÔ´Ï´Ù.

¸¹Àº °æ¿ì¿¡, ¿©·¯ºÐÀÌ ½ÇÁ¦·Î ÇÊ¿äÇÑ ¸ðµç °ÍÀº ¾î¶² µ¥ÀÌŸ¸¦ ¸í·É¾î·Î ½ÇÇà½ÃÄѼ­ ±× °á°ú¸¦ µ¹·Á ¹Þ´Â °ÍÀÔ´Ï´Ù. ±× µ¥ÀÌŸÀÇ Å©±â°¡ ¹«ÇÑ ÇÏÁö ¾Ê´ÂÇÑ, ÀÌ·¸°Ô Çϱâ À§ÇÑ °¡Àå ½¬¿î (±×¸®°í ¶§·Î´Â °¡Àå È¿À²ÀûÀÎ!) ¹æ¹ýÀº ±×°ÍÀ» Àӽà ÆÄÀÏ¿¡ ½á ³Ö°í ±× Àӽà ÆÄÀÏÀ» ÀÔ·ÂÀ¸·Î Çؼ­ ¸í·É¾î¸¦ ½ÇÇàÇÏ´Â °ÍÀÔ´Ï´Ù. Ç¥ÁØ ¸ðµâ tempfileÀº ÇÔ¼ö mktemp()¸¦ ¼öÃâÇϴµ¥ À¯ÀÏÇÑ Àӽà ÆÄÀÏÀ̸§À» »ý¼ºÇÕ´Ï´Ù.

ÁÖÀÇÇÒ °ÍÀº ¸¹Àº »óÈ£´ëÈ­Àû ÇÁ·Î±×·¥µéÀÌ (¿¹. vi) Ç¥ÁØ ÀԷ°ú Ãâ·ÂÀ» ´ë½ÅÇÏ´Â ÆÄÀÌÇÁ¿Í Àß ÀÛµ¿ÇÏÁö ¾Ê½À´Ï´Ù. ÆÄÀÌÇÁ ´ë½Å¿¡ À¯»ç ttys ("ptys")¸¦ »ç¿ëÇÒ ÇÊ¿ä°¡ ÀÖÀ» °ÍÀÔ´Ï´Ù. ¶óÀ̺귯¸® ¸ðµâ pty.py¿¡´Â ÀÌ·¯ÇÑ °ÍÀ» »ç¿ëÇÏ´Â ¹®¼­È­µÇÁö ¾ÊÀº Äڵ尡 ÀÖ½À´Ï´Ù -- ¾ÈŸ±õ°Ôµµ ¿©±â´Â ½º½º·Î ÇØ°áÇØ¾ß ÇÏ°Ú±º¿ä.

´Ù¸¥ ÇØ´äÀº µ· ¸®ºê(Don Libe)ÀÇ "expect" ¶óÀ̺귯¸®¿¡ ´ëÇÑ ÆÄÀ̽ã ÀÎÅÍÆäÀ̽º ÀÔ´Ï´Ù. expect¿Í Á¢¼Ó½ÃÄÑ ÁÖ´Â ÆÄÀ̽ã È®ÀåÀº "expy"¶ó°í ºÒ¸®¿ì¸ç ´ÙÀ½ http://expectpy.sourceforge.net//¿¡¼­ ¾òÀ» ¼ö ÀÖ½À´Ï´Ù.

expect¿Í ºñ½ÁÇÏ°Ô ÀÛµ¿ÇÏ´Â ¼ø¼öÇÑ ÆÄÀ̽ãÀû ÇØ°áÃ¥Àº Á¸ Å©·ÎÀÌ(John Croix)¿¡ ÀÇÇÑ PIPEÀÔ´Ï´Ù. PIPEÀÇ º£Å¸ÆÇÀº ´ÙÀ½ ftp://ftp.python.org/pub/python/contrib/System/¿¡¼­ ¾òÀ» ¼ö ÀÖ½À´Ï´Ù.


4.31. ÅÍÇà ¼Ó¿¡ ÀμöµéÀ» °¡Áø´Ù¸é ¾î¶»°Ô ÇÔ¼ö¸¦ È£ÃâÇϳª¿ä?

³»Àå ÇÔ¼ö apply()¸¦ »ç¿ëÇϼ¼¿ä. ¿¹¸¦ µé¾î,

    func(1, 2, 3)
´ÙÀ½°ú µ¿ÀÏÇÕ´Ï´Ù.

    args = (1, 2, 3)
    apply(func, args)
ÀÌ°ÍÀº func(args)¿Í °°Àº °ÍÀÌ ¾Æ´Ï¶ó´Â °ÍÀ» ÁÖ¸ñÇϼ¼¿ä -- ±×°ÍÀº func()¸¦ ¼¼°³ÀÇ Àμö(Á¤¼ö 1,2 ±×¸®°í 3) ´ë½Å¿¡, Á¤È®ÇÏ°Ô ÇϳªÀÇ Àμö(ÅÍÇà args)·Î È£ÃâÇÕ´Ï´Ù.

ÆÄÀ̽ã 2.0¿¡¼­´Â, È®ÀåµÈ È£Ãâ ±¸¹®À» »ç¿ëÇÒ ¼öµµ ÀÖ½À´Ï´Ù:

f(*args)´Â apply(f, args)¿Í µ¿µîÇÕ´Ï´Ù.


4.32. À̸ƽº¿¡¼­ ¾î¶»°Ô ÆÄÀ̽ãÀ» À§ÇÑ ÆùÆ®-Àá±Ý-¸ðµå(font-lock-mode)¸¦ »ç¿ë°¡´ÉÇÏ°Ô Çϳª¿ä?

À̸ƽº 19.14 ÀÌ»ó, ¸ðµç XEmacs 20, FSF Emacs 19.34 ȤÀº ¸ðµç Emacs 20À» »ç¿ëÇÏ°í °è½Å´Ù¸é, ÃÖ±ÙÀÇ python-mode.elÀ» »ç¿ëÇϽøé, È­¸é-Àá±Ý(font-lock)Àº ¿©·¯ºÐÀ» ´ë½ÅÇÏ¿© ÀÚµ¿ÀûÀ¸·Î ÀÛµ¿ÇÒ °ÍÀÔ´Ï´Ù.

ÀÌÀüÀÇ XEmacs ¶Ç´Â Emacs¸¦ »ç¿ëÇÏ°í °è½Ã¸é ´ÙÀ½À» .emacs ÆÄÀÏ¿¡ »ðÀÔÇÒ ÇÊ¿ä°¡ ÀÖÀ» °ÍÀÔ´Ï´Ù:

        (defun my-python-mode-hook ()
          (setq font-lock-keywords python-font-lock-keywords)
          (font-lock-mode 1))
        (add-hook 'python-mode-hook 'my-python-mode-hook)


4.33. scanf() ¶Ç´Â sscanf()¿Í °°Àº °ÍÀÌ ÀÖ³ª¿ä?

±×·¯ÇÑ °ÍÀº ¾ø½À´Ï´Ù.

°£´ÜÇÑ ÀÔ·Â Çؼ®À» À§Çؼ­´Â, °¡Àå °£´ÜÇÑ Á¢±Ù¹ýÀº º¸Åë ±× ¶óÀÎÀ» °ø¹éÀ¸·Î-±¸ºÐµÈ ´Ü¾î·Î string.split()¸¦ »ç¿ëÇÏ¿© ³ª´©±¸, ½ÊÁø ¹®ÀÚ¿­À» ¼öÄ¡ °ªÀ¸·Î string.atoi(), string.atol() ¶Ç´Â string.atof()¸¦ »ç¿ëÇÏ¿© º¯È¯ÇÏ´Â °ÍÀÔ´Ï´Ù. (ÆÄÀ̽ãÀÇ atoi()´Â 32-ºñÆ®ÀÌ°í atol()Àº ¹«ÇÑ Á¤¹ÐµµÀÔ´Ï´Ù.) string.split´Â ¼±ÅÃÀûÀÎ "sep" ¸Å°³º¯¼ö¸¦ Á¦°øÇϴµ¥ ±× ¶óÀÎÀÌ °ø¹éÀÌ ¾Æ´Ñ ´Ù¸¥ ¾î¶² °ÍÀ¸·Î ±¸ºÐÀÚ¸¦ »ç¿ëÇÏ°íÀÚ ÇÒ ¶§ À¯¿ëÇÕ´Ï´Ù.

´õ º¹ÀâÇÑ ÀÔ·Â Çؼ®À» À§Çؼ­´Â, Á¤±Ô Ç¥Çö½Ä(re¸ðµâ ÂüÁ¶)ÀÌ CÀÇ sscanf()º¸´Ù ´õ °­·ÂÇÏ°í ÀûÇÕÇÕ´Ï´Ù.

sscanf()¸¦ Èä³»³»´Â, ½ºÆ¼ºê Ŭ¸®ÇÁÆ®(Steve Clift)°¡ Á¦°øÇÑ ¸ðµâÀÌ ÀÖ½À´Ï´Ù; ´ÙÀ½ ftp »çÀÌÆ®ÀÇ contrib/Misc/sscanfmodule.c¸¦ ÂüÁ¶Çϼ¼¿ä:

    http://www.python.org/ftp/python/contrib-09-Dec-1999/Misc/


4.34. ÀÔÃâ·ÂÀ» ±â´Ù¸®¸é¼­ Tk »ç°ÇÀ» ó¸®ÇÒ ¼ö ÀÖ³ª¿ä?

³×, ±×¸®°í ½ÉÁö¾î´Â ¾²·¹µåÁ¶Â÷ ÇÊ¿äÇÏÁö ¾Ê½À´Ï´Ù! ±×·¯³ª I/O Äڵ带 ¾à°£ ¼öÁ¤ÇÒ ÇÊ¿ä°¡ ÀÖ½À´Ï´Ù. Tk´Â XtÀÇ XtAddInput() È£Ãâ°ú µ¿µîÇѵ¥, ±×°ÍÀ¸·Î ¿ªÈ£Ãâ ÇÔ¼ö¸¦ µî·ÏÇÒ ¼ö À־, I/O°¡ ÆÄÀÏ ±â¼úÀÚ¿¡ ´ëÇÏ¿© °¡´ÉÇÏ°Ô µÉ ¶§ Tk ÁÖ È¸µ¹À̷κÎÅÍ È£ÃâµÉ °ÍÀÔ´Ï´Ù. ¿©±â¿¡ ¿©·¯ºÐÀÌ ÇÊ¿äÇÑ °ÍÀÌ ÀÖ½À´Ï´Ù:

        from Tkinter import tkinter
        tkinter.createfilehandler(file, mask, callback)
±× ÆÄÀÏÀº ÆÄÀ̽ã ÆÄÀÏ È¤Àº ¼ÒÄÏ °´Ã¼(½ÇÁ¦·Î, fileno() ¸Þ½îµå¸¦ °¡Áø ¸ðµç °Í), ȤÀº Á¤¼ö ÆÄÀÏ ±â¼úÀÚÀÏ ¼ö ÀÖ½À´Ï´Ù. mask´Â tkinter.READABLE ¶Ç´Â tkinter.WRITABLE »ó¼öÁßÀÇ ÇϳªÀÔ´Ï´Ù. ¿ªÈ£ÃâÀº ´ÙÀ½°ú °°ÀÌ È£ÃâµË´Ï´Ù:

        callback(file, mask)
ÀÛ¾÷ÀÌ ³¡³ª¸é, ´ÙÀ½À» »ç¿ëÇÏ¿© ¹Ýµå½Ã ±× ¿ªÈ£Ãâ ÇÔ¼ö¸¦ µî·Ï Ãë¼ÒÇØ¾ß ÇÕ´Ï´Ù.

        tkinter.deletefilehandler(file)
ÁÖÀÇ: Àб⸦ À§ÇØ *¾ó¸¶³ª ¸¹Àº ¹ÙÀÌÆ®°¡* »ç¿ë°¡´ÉÇÑÁö¸¦ ¾Ë ¼ö ¾øÀ¸¹Ç·Î, ÆÄÀ̽ã ÆÄÀÏ °´Ã¼ÀÇ read ¶Ç´Â readline ¸Þ½îµå¸¦ »ç¿ëÇÒ ¼ö ¾ø´Âµ¥, ¿Ö³ÄÇϸé À̰͵éÀº °è¼ÓÇÏ¿© ¹Ì¸® Á¤ÀÇµÈ °³¼öÀÇ ¹ÙÀÌÆ®¸¦ ÀÐÀ¸·Á°í ½ÃµµÇϱ⠶§¹®ÀÔ´Ï´Ù. ¼ÒÄÏ¿¡ ´ëÇؼ­, recv() ȤÀº recvfrom() ¸Þ½îµå´Â Àß ÀÛµ¿ÇÒ °ÍÀÔ´Ï´Ù; ´Ù¸¥ ÆÄÀϵ鿡 ´ëÇؼ­´Â, os.read(file.fileno(), maxbytecount)¸¦ »ç¿ëÇϼ¼¿ä.


4.35. Ãâ·Â ¸Å°³º¯¼ö¸¦ °¡Áø ÇÔ¼ö¸¦ ¾î¶»°Ô ÀÛ¼ºÇϳª¿ä (ÂüÁ¶¿¡ ÀÇÇÑ È£Ãâ)?

[Mark Lutz] ±â¾ïÇØ¾ß ÇÒ °ÍÀº, ÆÄÀ̽㿡¼­´Â ÇÒ´çÀ¸·Î ÀμöµéÀÌ °Ç³×Áø´Ù´Â °ÍÀÔ´Ï´Ù. ÇÒ´çÀº ´Ü¼øÈ÷ °´Ã¼µé¿¡ ´ëÇÑ ÂüÁ¶Á¡¸¸À» »ý¼ºÇϱ⠶§¹®¿¡, È£ÃâÀÚ¿Í ÇÇÈ£ÃâÀÚ »çÀÌÀÇ Àμö À̸§ »çÀÌ¿¡ º°¸íÀº ¾ø½À´Ï´Ù, ±×·¡¼­ º»·¡ ÂüÁ¶¿¡-ÀÇÇÑ-È£ÃâÀº ¾ø½À´Ï´Ù. ±×·¯³ª ´Ù¾çÇÑ ¹æ¹ýÀ¸·Î Èä³»³¾ ¼ö ÀÖ½À´Ï´Ù:

1) Àü¿ª º¯¼ö¸¦ »ç¿ëÇÔÀ¸·Î½á; ±×·¯³ª ¾Æ¸¶µµ ±×·¡¼­´Â ¾ÈµÇ°ÚÁö¿ä :-)

2) º¯°æ°¡´É(ÀûÀýÇÑ °÷¿¡¼­ º¯°æ°¡´É)ÇÑ °´Ã¼¸¦ °Ç³× ÁÜÀ¸·Î½á:

      def func1(a):
          a[0] = 'new-value'     # 'a' references a mutable list
          a[1] = a[1] + 1        # changes a shared object
      args = ['old-value', 99]
      func1(args)
      print args[0], args[1]     # output: new-value 100
3) ÀμöµéÀÇ ¸¶Áö¸· °ªÀ» À¯ÁöÇÏ°í, ÅÍÇÃÀ» ¹ÝȯÇÔÀ¸·Î½á:

      def func2(a, b):
          a = 'new-value'        # a and b are local names
          b = b + 1              # assigned to new objects
          return a, b            # return new values
      x, y = 'old-value', 99
      x, y = func2(x, y)
      print x, y                 # output: new-value 100
4) ±×¸®°í ÆÄÀ̽ãÀÇ °´Ã¼ ¸ðµ¨À¸·ÎºÎÅÍ ÆÄ»ýµÈ ´Ù¸¥ ¾ÆÀ̵ð¾î. ¿¹¸¦ µé¾î, º¯°æ°¡´ÉÇÑ »çÀü¿¡ °Ç³×ÁÖ´Â °ÍÀÌ ´õ ¸í·áÇÒ ¼öµµ ÀÖ½À´Ï´Ù:

      def func3(args):
          args['a'] = 'new-value'     # args is a mutable dictionary
          args['b'] = args['b'] + 1   # change it in-place
      args = {'a':' old-value', 'b': 99}
      func3(args)
      print args['a'], args['b']
5) ¶Ç´Â Ŭ·¡½º ½Çü¿¡ °ªµéÀ» ÇÔ²² ½Î-³Ö¾î¼­:

      class callByRef:
          def __init__(self, **args):
              for (key, value) in args.items():
                  setattr(self, key, value)
      def func4(args):
          args.a = 'new-value'        # args is a mutable callByRef
          args.b = args.b + 1         # change object in-place
      args = callByRef(a='old-value', b=99)
      func4(args)
      print args.a, args.b
   ±×·¯³ª ÀÌ°ÍÀ» º¹ÀâÇÏ°Ô ÇؾßÇÒ ¾î¶² Á¤´çÇÑ ÀÌÀ¯µµ ¾ø½À´Ï´Ù :-).
[ÆÄÀ̽ãÀÇ ÀúÀÚ´Â ¼¼¹ø° ÇØ°áÃ¥À» ´ëºÎºÐÀÇ °æ¿ì¿¡ ¼±È£ÇÕ´Ï´Ù.]


4.36. ÆÄÀ̽㿡¼­ÀÇ Áö¿ª°ú Àü¿ª º¯¼ö¿¡ °üÇÑ ±ÔÄ¢À» ¼³¸í Á» ÇØ ÁÖ¼¼¿ä.

[ÄË ¸¸ÇÏÀ̸Ó(Ken Manheimer)] ÆÄÀ̽㿡¼­, ÇÁ·Î½ÃÁ® º¯¼öµéÀº ¹¬½ÃÀûÀ¸·Î Àü¿ªÀûÀÔ´Ï´Ù, ºí·Ï¾ÈÀÇ ¾î¶² °÷¿¡¼­ ÇÒ´çµÇÁö¸¸ ¾Ê´Â´Ù¸é ¸»ÀÌÁö¿ä. ±×·¯ÇÑ °æ¿ì¿¡ ±× º¯¼öµéÀº ¹¬½ÃÀûÀ¸·Î Áö¿ªÀûÀÔ´Ï´Ù, ±×¸®°í ¸í½ÃÀûÀ¸·Î ±×°ÍµéÀ» 'Àü¿ª(global)'À¸·Î ¼±¾ðÇÒ ÇÊ¿ä°¡ ÀÖ½À´Ï´Ù.

óÀ½¿¡´Â ¾à°£ ³î¶ó°ÚÁö¸¸, Àá½Ã »ý°¢ÇØ º¸¸é ÀÌÇØ°¡ µË´Ï´Ù. ÇÑ ÆíÀ¸·Î´Â, ÇÒ´çµÈ º¯¼öµé¿¡ ´ëÇØ 'global'À» ¿ä±¸ÇÔÀ¸·Î½á ÀǵµÇÏÁö ¾ÊÀº ºÎ-ÀÛ¿ëÀ¸·ÎºÎÅÍ ¹æ¾î¸·À» Á¦°øÇÕ´Ï´Ù. ´Ù¸¥ ÇÑÆíÀ¸·Î, ¸¸¾à globalÀÌ ¸ðµç Àü¿ª ÂüÁ¶¿¡ ´ëÇÏ¿© ÇÊ¿äÇÏ´Ù¸é, Ç×»ó globalÀ» »ç¿ëÇÏ´Â ÆíÀÌ ÁÁÀ» °ÍÀÔ´Ï´Ù. ¿¹¸¦ µé¾î, ³»Àå ÇÔ¼ö ȤÀº ¼öÀÔµÈ ¸ðµâÀÇ ÄÄÆ÷³ÍÆ®¿¡ ´ëÇÑ ¸ðµç ÂüÁ¶Á¡µéÀ» global·Î ¼±¾ðÇÒ ÇÊ¿ä°¡ ÀÖ½À´Ï´Ù. ÀÌ·¯ÇÑ È¥¶õ¶§¹®¿¡ ºÎ-ÀÛ¿ëÀ» ±¸º°ÇØ ³»´Â 'Àü¿ª'¼±¾ðÀÇ À¯¿ëÇÔÀÌ ºûÀ» ÀÒ¾î ¹ö¸± °ÍÀÔ´Ï´Ù.


4.37. ¼­·Î°£¿¡ ¼öÀÔÀ» ÇÏ´Â ¸ðµâÀ» ¾î¶»°Ô °¡Áú ¼ö ÀÖ³ª¿ä?

Áü ·Î½ºÅ²Æ®(Jim Roskind)´Â ´ÙÀ½ÀÇ ¼ø¼­¸¦ °¢ ¸ðµâ¿¡ ±ÇÀåÇÕ´Ï´Ù:

¸ÕÀú: ¸ðµç ¼öÃâ¹® (Àü¿ª º¯¼ö, ÇÔ¼ö, ±×¸®°í Ŭ·¡½º¿Í °°Àº, ¼öÀÔµÈ ±âº» Ŭ·¡½º¸¦ ÇÊ¿ä·Î ÇÏÁö ¾Ê´Â °Íµé).

±×¸®°í ³ª¼­: ¸ðµç ¼öÀÔ ¼­¼ú¹®.

¸¶Áö¸·À¸·Î: ¸ðµç ÀÛµ¿ ÄÚµå (¼öÀÔµÈ °ªÀ¸·ÎºÎÅÍ ÃʱâÈ­µÈ Àü¿ª º¯¼öµéÀ» Æ÷ÇÔÇÑ´Ù).

¼öÀÔ¹®µéÀÌ ÀÌ»óÇÑ °÷¿¡ ³ªÅ¸³ª±â ¶§¹®¿¡ ÆÄÀ̽ãÀÇ ÀúÀÚ´Â ÀÌ·¯ÇÑ Á¢±Ù¹ýÀ» º°·Î ÁÁ¾ÆÇÏÁö ¾Ê½À´Ï´Ù, ±×·¯³ª ±×°ÍÀÌ ÀÛµ¿ÇÑ´Ù´Â °ÍÀº ÀÎÁ¤ÇØ¾ß ÇÕ´Ï´Ù. ±×°¡ ±ÇÀåÇÑ Àü·«Àº ¸ðµç "from <module> import *"ÀÇ »ç¿ëÀ» ÇÇÇÏ°í (±×·¡¼­ ¼öÀÔµÈ ¸ðµâÀÇ ¸ðµç °ÍÀº <module>.<name>À¸·Î ÂüÁ¶µË´Ï´Ù.) ±×¸®°í ¸ðµç Äڵ带 ÇÔ¼ö ¾ÈÂÊ¿¡ ¹èÄ¡È÷´Â °ÍÀÔ´Ï´Ù. Àü¿ª º¯¼ö¿Í Ŭ·¡½º º¯¼ö¸¦ ÃʱâÈ­ ÇÏ·Á¸é »ó¼ö ȤÀº ³»Àå ÇÔ¼ö¸¸À» »ç¿ëÇØ¾ß ÇÕ´Ï´Ù.


4.38. ÆÄÀ̽㿡¼­ °´Ã¼¸¦ ¾î¶»°Ô º¹»çÇϳª¿ä?

ÃÑ°ýÀûÀÎ º¹»ç ¿¬»êÀÌ ÆÄÀ̽ãÀ¸·Î ±¸ÃàµÇ¾î µé¾î°¡Áö´Â ¾Ê¾Ò½À´Ï´Ù, ±×·¸Áö¸¸ ´ëºÎºÐÀÇ °´Ã¼ ÇüÀº º¹Á¦¹°À» »ý¼ºÇÏ´Â ¹æ¹ýÀ» °¡Áö°í ÀÖ½À´Ï´Ù. ´ë´ÜÈ÷ ÀϹÝÀûÀÎ °´Ã¼µéÀ» À§ÇÑ ¹æ¹ýÀ» ¼Ò°³Çϸé:

º¯°æºÒ°¡ °´Ã¼(¼ýÀÚ, ¹®ÀÚ¿­, ÅÍÇÃ)¿¡ ´ëÇؼ­´Â, º¹Á¦°¡ ºÒÇÊ¿äÇѵ¥ ±×µéÀÇ °ªÀÌ º¯°æÀÌ ºÒ°¡´ÉÇϱ⠶§¹®ÀÔ´Ï´Ù. ¸®½ºÆ® (±×¸®°í ÀϹÝÀûÀ¸·Î º¯°æ°¡´ÉÇÑ ¿¬¼Ó¿­ Çüµé)¿¡ ´ëÇؼ­´Â, º¹Á¦´Â Ç¥Çö½Ä l[:]¿¡ ÀÇÇؼ­ »ý¼ºµË´Ï´Ù. »çÀüÀ» À§Çؼ­´Â, ´ÙÀ½ÀÇ ÇÔ¼ö°¡ º¹Á¦¹°À» ¹ÝȯÇÕ´Ï´Ù:

        def dictclone(o):
            n = {}
            for k in o.keys(): n[k] = o[k]
            return n
¸¶Áö¸·À¸·Î, ÀϹÝÀûÀÎ °´Ã¼¿¡ ´ëÇؼ­´Â, "copy" ¸ðµâÀº °´Ã¼¸¦ º¹»çÇϱâ À§ÇØ µÎ °³ÀÇ ÇÔ¼ö¸¦ Á¤ÀÇÇÕ´Ï´Ù. copy.copy(x)´Â À§¿¡ ¾ð±ÞÇÑ ±ÔÄ¢¿¡ ÀÇÇÏ¿© º¸¿©Áø´ë·Î º¹»çº»À» ¹ÝȯÇÕ´Ï´Ù. copy.deepcopy(x)´Â º¹ÇÕÀûÀÎ °´Ã¼ÀÇ ¿ä¼Òµéµµ º¹»çÇÕ´Ï´Ù. ¶óÀ̺귯¸® ÂüÁ¶ ¸Å´º¾ó¿¡ ÀÖ´Â ÀÌ ¸ðµâ¿¡ °üÇÑ ¼½¼ÇÀ» »ìÆ캸¼¼¿ä.


4.39. ÆÄÀ̽㿡 ºÒ¸êÇÏ´Â °´Ã¼¸¦ ±¸ÇöÇÏ´Â ¹ý? (Persistent == ÀÚµ¿ÀûÀ¸·Î µð½ºÅ©¿¡ ÀúÀåµÇ°í º¹±¸µÇ´Â.)

¶óÀ̺귯¸® ¸ðµâ "pickle"Àº ÀÌÁ¦ ÀÌ ¹®Á¦¸¦ ¸Å¿ì ÀϹÝÀûÀÌ ¹æ¹ýÀ¸·Î ÇØ°áÇÕ´Ï´Ù (±×·¸Áö¸¸ ¿©ÀüÈ÷, ¿­·ÁÁø ÆÄÀÏ, ¼ÒÄÏ È¤Àº À©µµ¿ì¿Í °°Àº °ÍµéÀ» ÀúÀåÇÒ ¼ö´Â ¾ø½À´Ï´Ù), ±×¸®°í ¶óÀ̺귯¸® ¸ðµâ "shelve"´Â pickle°ú (g)dbmÀ» »ç¿ëÇÏ¿© ÀÓÀÇÀÇ ÆÄÀ̽㠰´Ã¼¸¦ ´ã°í ÀÖ´Â ºÒ¸êÀÇ Â¦Áþ±â¸¦ »ý¼ºÇÕ´Ï´Ù. ´õ ³ªÀº ¼º´ÉÀ» ¿øÇÏ½Ã¸é »ó´ëÀûÀ¸·Î ÃÖ±ÙÀÇ cPickle ¸ðµâ ÃֽŠ¹öÀüÀ» Âü°íÇϼ¼¿ä.

¾à°£Àº ¾î»öÇÑ Ã³¸® ¹æ¹ýÀº pickleÀÇ ±Í¿©¿î ¿©µ¿»ý, marshalÀ» »ç¿ëÇÏ´Â °ÍÀÔ´Ï´Ù. marshal ¸ðµâÀº ºñ¼øȯÀû ±âº» ÆÄÀ̽ã ÇüµéÀ» ÆÄÀÏ°ú ¹®ÀÚ¿­·Î, ±×¸®°í ±× ¹Ý´ë·Î ÀúÀåÇÏ´Â ´ë´ÜÈ÷ ºü¸¥ ¹æ¹ýÀ» Á¦°øÇÕ´Ï´Ù. marshalÀÌ ½ÇüµéÀ» ÀúÀåÇϰųª °øÀ¯ ÂüÁ¶Á¡µéÀ» ÀûÀýÇÏ°Ô Ã³¸®ÇÏ´Â ÀÛ¾÷µî¿¡´Â ºÎÀûÀýÇϱâ´Â ÇÏÁö¸¸, ±×°ÍÀº ¾öû³ª°Ô ºü¸£°Ô ½ÇÇàµË´Ï´Ù. ¿¹¸¦ µé¾î ¹Ý ¸Þ°¡ÀÇ µ¥ÀÌŸ¸¦ ÀûÀçÇϴµ¥ (¾î¶² ¸Ó½Å¿¡¼­´Â) 3ºÐÀÇ 1ÃÊ ÀÌÇÏ°¡ ¼Ò¿äµË´Ï´Ù. ¶§·Î´Â À̰Ͷ§¹®¿¡ gdbmÀ» pickle/shelve¿Í »ç¿ëÇÏ´Â °Í°ú °°Àº Á» ´õ º¹ÀâÇÏ°í ÀϹÝÀûÀÎ ÀÛ¾÷À» ÇÏ´Â °ÍÀÌ ºûÀ» ÀÒ½À´Ï´Ù.


4.40. __spam¸¦ »ç¿ëÇØ º¸·Á°í Çϴµ¥ _SomeClassName__spam¿¡ °üÇÑ ¿¡·¯¸¦ ¸ÂÀÌÇÕ´Ï´Ù.

µÎ°³ÀÇ À̲ô´Â ¹ØÁÙ¹®ÀÚ¸¦ °¡Áø º¯¼öµéÀº Ŭ·¡½º »çÀû º¯¼öµéÀ» Á¤ÀÇÇϱâ À§ÇÑ, °£°áÇÑ ±×·¯³ª È¿À²ÀûÀÎ ¹æ¹ýÀ» Á¦°øÇϱâ À§ÇØ "¸¸µé¾îÁ³½À´Ï´Ù". ÆÄÀ̽ã Áöħ¼­ÀÇ "New in Release 1.4"ÀåÀ» ÂüÁ¶Çϼ¼¿ä.


4.41. ¾î¶»°Ô ÆÄÀÏÀ» »èÁ¦Çϳª¿ä? ±×¸®°í ´Ù¸¥ ÆÄÀÏ°ü·Ã Áú¹®µé.

os.remove(filename) ȤÀº os.unlink(filename)¸¦ »ç¿ëÇϼ¼¿ä; ¹®¼­¸¦ ¿øÇϽøé, ±× ¶óÀ̺귯¸® ¸Å´º¾ó¿¡¼­ posix ¼½¼ÇÀ» ÂüÁ¶Çϼ¼¿ä. ±× µÑÀº °°Àº µ¿ÀÏÇÑ °ÍÀÔ´Ï´Ù, unlink()´Â ÀÌ ÇÔ¼ö¸¦ À§ÇÑ À¯´Ð½ºÀÇ À̸§ÀÏ »ÓÀÔ´Ï´Ù. ÀÌÀüÀÇ ÆÄÀ̽㠹öÀü¿¡¼­´Â, os.unlink()¸¸ÀÌ »ç¿ë°¡´É Çß½À´Ï´Ù.

µð·ºÅ丮¸¦ Á¦°ÅÇϱâ À§Çؼ­´Â, os.rmdir()À» »ç¿ëÇÏ°í; os.mkdir()À» »ç¿ëÇؼ­ µð·ºÅ丮¸¦ ¸¸µå¼¼¿ä.

ÆÄÀÏÀÇ À̸§À» ¹Ù²Ù·Á¸é, os.rename()À» »ç¿ëÇϼ¼¿ä.

ÆÄÀÏÀ» ÀÚ¸£·Á¸é, ±×°ÍÀ» f = open(filename, "r+")À» »ç¿ëÇÏ¿© ¿­°í, ±×¸®°í f.truncate(offset)À» »ç¿ëÇϼ¼¿ä; offsetÀº ÇöÀçÀÇ Å½»öÀ§Ä¡°¡ ±âº»°ªÀÔ´Ï´Ù. ("r+" ¸ðµå´Â ±× ÆÄÀÏÀ» Àбâ¿Í ¾²±â¿ëÀ¸·Î °³¹æÇÕ´Ï´Ù.) os.open()À¸·Î ¿­·ÁÁø ÆÄÀϵ鿡 ´ëÇؼ­´Â os.ftruncate(fd, offset)µµ ÀÖ½À´Ï´Ù -- À¯´Ð½º Àü¹®°¡¿ë.

shutil ¸ðµâÀº ¶ÇÇÑ ÆÄÀϵ鿡 ´ëÇÑ ÀÛ¾÷À» ÇÏ´Â ¸¹Àº ¼öÀÇ ÇÔ¼öµéÀ» ´ã°í Àִµ¥ copyfile, copytree, ±×¸®°í rmtree µîµîÀ» Æ÷ÇÔÇÕ´Ï´Ù.


4.42. urllib ¶Ç´Â httplib¸¦ ¼öÁ¤ÇÏ¿© HTTP/1.1¸¦ Áö¿øÇÏ´Â ¹ý?

ÃÖ±Ù ¹öÀüÀÇ ÆÄÀ̽ã(2.0 ÀÌ»ó)Àº ±âº»ÀûÀ¸·Î HTTP/1.1À» Áö¿øÇÕ´Ï´Ù.


4.43. compile() ¶Ç´Â exec Áß¿¡ ¸¸³ª´Â ÀÌÇØÇÒ ¼ö ¾ø´Â ±¸¹® ¿¡·¯.

¼­¼ú¹® ¸ðµÒÀÌ (Ç¥Çö½Ä°ú ´ëÁ¶ÇÏ¿©) compile(), exec ¶Ç´Â execfile()·Î ÄÄÆÄÀÏ µÉ ¶§, ±×°ÍÀº ¹Ýµå½Ã newlineÀ¸·Î ³¡³ª¾ß¸¸ ÇÕ´Ï´Ù. ¾î¶² °æ¿ì¿¡, ¼Ò½º°¡ µé¿©¾²±âµÈ ºí·ÏÀ¸·Î ³¡³¯¶§´Â, Àû¾îµµ µÎ °³ÀÇ newlinesÀÌ ÇÊ¿äÇÑ µíÀÌ º¸ÀÔ´Ï´Ù.


4.44. ¹®ÀÚ¿­À» ¾î¶»°Ô ¼ýÀÚ·Î ¹Ù²Ù³ª¿ä?

Á¤¼ö¿¡ ´ëÇؼ­´Â, ³»Àå int() ÇÔ¼ö¸¦ »ç¿ëÇϼ¼¿ä, ¿¹. int('144') == 144. ºñ½ÁÇÏ°Ô, long()Àº ¹®ÀÚ¿­À» ¹èÁ¤µµ Á¤¼ö·Î º¯È¯ÇÕ´Ï´Ù, ¿¹. long('144') == 144L; ±×¸®°í float()´Â ºÎµ¿¼Ò¼öÁ¡¼ö·Î º¯È¯ÇÕ´Ï´Ù, ¿¹. float('144') == 144.0.

ÁÖÀÇÇÒ °ÍÀº ÀÌ·¯ÇÑ °ÍµéÀº ½ÊÁø ¹ø¿ªÀ¸·Î Á¦Çѵȴٴ °ÍÀÔ´Ï´Ù, ±×·¡¼­ int('0144') == 144 ±×¸®°í int('0x144')´Â ValueError¸¦ ÀÏÀ¸Åµ´Ï´Ù. ÆÄÀ̽ã 2.0¿¡¼­ int´Â º¯È¯Çϱâ À§Çؼ­ ¹Ø¼ö(base)¸¦ ¼±ÅÃÀûÀÎ µÎ ¹ø° Àμö·Î ÃëÇϴµ¥, ±×·¡¼­ int('0x144', 16) == 324.

´õ¿í À¯¿¬ÇÏ°Ô »ç¿ëÇÏ°í ½Í°Å³ª, ȤÀº ÆÄÀ̽ã 1.5 ÀÌÀüÀ̶ó¸é, string ¸ðµâÀ» ¼öÀÔÇؼ­ Á¤¼ö¿¡ ´ëÇؼ­´Â string.atoi() ÇÔ¼ö¸¦ »ç¿ëÇÏ°í, ¹èÁ¤µµ Á¤¼ö¿¡ ´ëÇؼ­´Â string.atol()¸¦ »ç¿ëÇϰųª, ȤÀº ºÎµ¿¼Ò¼öÁ¡¼ö¿¡ ´ëÇؼ­´Â string.atof()¸¦ »ç¿ëÇϼ¼¿ä. ¿¹¸¦ µé¾î, string.atoi('100', 16) == string.atoi('0x100', 0) == 256. string ¸ðµâ¿¡ °üÇÏ¿© ´õ ÀÚ¼¼È÷ ¾Ë°í ½ÍÀ¸¸é ¶óÀ̺귯¸® ÂüÁ¶ ¸Å´º¾ó ¼½¼ÇÀ» ÂüÁ¶Çϼ¼¿ä.

±×·¯ÇÑ ¸ðµç °Íµé ´ë½Å¿¡ ³»Àå ÇÔ¼ö eval()À» »ç¿ëÇÒ ¼ö´Â ÀÖÁö¸¸, ±ÇÀåµÇÁö ¾Ê½À´Ï´Ù, ¿Ö³ÄÇÏ¸é ¾î¶²ÀÌ°¡ (µð½ºÅ©¸¦ Æ÷¸ËÇÏ´Â °Í°ú °°Àº) ¿øÇÏÁö ¾Ê´Â ºÎÀÛ¿ëÀ» °¡Áö´Â ÆÄÀ̽ã Ç¥Çö½ÄÀ» ³Ñ°ÜÁÙ ¼ö Àֱ⠶§¹®ÀÔ´Ï´Ù. ¶ÇÇÑ ¼ýÀÚ¸¦ ÆÄÀ̽ãÀÇ Ç¥Çö½ÄÀ¸·Î ¹ø¿ªÇعö¸®´Â È¿°úµµ °¡Áö´Âµ¥, ¿¹¸¦ µé¾î eval('09')´Â ÆÄÀ̽ãÀÌ '0'À¸·Î ½ÃÀÛÇÏ´Â ¼ýÀÚµéÀ» 8Áø¼ö(base 8)·Î °£ÁÖÇϱ⠶§¹®¿¡ ±¸¹®¿¡·¯¸¦ ¹ß»ý½Ãŵ´Ï´Ù.


4.45. ¾î¶»°Ô ¼ýÀÚ¸¦ ¹®ÀÚ¿­·Î º¯È¯Çϳª¿ä?

¿¹¸¦ µé¾î, ¼ýÀÚ 144¸¦ ¹®ÀÚ¿­ '144'·Î º¯È¯ÇÏ·Á¸é, ³»Àå ÇÔ¼ö repr() ¶Ç´Â backquote Ç¥±â¹ýÀ» »ç¿ëÇϼ¼¿ä (À̰͵éÀº µ¿µîÇÕ´Ï´Ù). ¸¸¾à 16Áø¼ö ȤÀº 8Áø¼ö Ç¥ÇöÀ» ¿øÇϸé, °¢°¢¿¡ ´ëÇÏ¿© ³»Àå ÇÔ¼ö hex() ¶Ç´Â oct()¸¦ »ç¿ëÇϼ¼¿ä. ȯ»óÀûÀ¸·Î Çü½ÄÈ­ÇÏ·Á¸é, ¹®ÀÚ¿­¿¡ % ¿¬»êÀÚ¸¦ »ç¿ëÇϼ¼¿ä, CÀÇ printf Çü½Ä°ú ¸¶Âù°¡Áö·Î, ¿¹¸¦ µé¾î, "%04d" % 144 ´Â '0144'¸¦ »êÃâÇÏ°í "%.3f" % (1/3.0)´Â '0.333'À» »êÃâÇÕ´Ï´Ù. ÀÚ¼¼ÇÑ °ÍÀº ¶óÀ̺귯¸® ÂüÁ¶ ¸Å´º¾óÀ» º¸¼¼¿ä.


4.46. ¾î¶»°Ô ÆÄÀÏÀ» º¹»çÇϳª¿ä?

shutil ¸ðµâÀÌ Àִµ¥ º¹»ç ȸµ¹À̸¦ ±¸ÇöÇÏ´Â copyfile() ÇÔ¼ö¸¦ ´ã°í ÀÖ½À´Ï´Ù; ±×·¸Áö¸¸, ¸ÅŲÅä½Ã¿¡´Â ÃæºÐÇÏÁö ¾Ê½À´Ï´Ù: ±×°ÍÀº ÀÚ¿ø Æ÷Å© (resource fork)¿Í ÆÄÀδõ Á¤º¸(Finder info)¸¦ º¹»çÇÏÁö ¾Ê½À´Ï´Ù.


4.47. ÇÑ °´Ã¼°¡ ÁÖ¾îÁø Ŭ·¡½ºÀÇ ½ÇüÀÎÁö ȤÀº ±×ÀÇ ÇϺΠŬ·¡½ºÀÎÁö¸¦ ¾î¶»°Ô Á¡°ËÇϳª¿ä?

±× Ŭ·¡½ºµéÀ» ´ëÃæ´ëÃæ °³¹ßÇÏ°í ÀÖ´Ù¸é, ´õ¿í ÀûÀýÇÏ°Ô °´Ã¼-ÁöÇâÀûÀÎ ½ºÅ¸ÀÏ·Î ÇÁ·Î±×·¥ÇÏ´Â ÆíÀÌ ÁÁÀ» °ÍÀÔ´Ï´Ù -- Ŭ·¡½º ±¸¼º¿ø¿¡ ±âÃÊÇÑ ´Ù¸¥ ÀÏÀ» ÇÏ´Â ´ë½Å¿¡, ¸Þ½îµå¸¦ »ç¿ëÇÏ°í ±× ¸Þ½îµå¸¦ ´Ù¸¥ Ŭ·¡½º¿¡ ´Ù¸£°Ô Á¤ÀÇÇÏ´Â °ÍÀº ¾î¶²°¡¿ä?

±×·¸Áö¸¸, ¾î¶² °íÁ¤µÈ »óȲ¿¡¼­´Â Ŭ·¡½º ±¸¼º¿øÀ» Å×½ºÆ®ÇÒ ÇÊ¿ä°¡ ÀÖ½À´Ï´Ù.

ÆÄÀ̽ã 1.5¿¡¼­, ³»Àå ÇÔ¼ö isinstance(obj, cls)¸¦ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù.

´ÙÀ½ÀÇ Á¢±Ù¹ýÀº ÀÌÀüÀÇ ÆÄÀ̽㠹öÀü°ú »ç¿ëµÉ ¼ö ÀÖ½À´Ï´Ù:

ºÒ¸íÈ®ÇÑ ¹æ½ÄÀº ±× °´Ã¼¸¦ ¿¹¿Ü·Î ÀÏÀ¸Å°°í, Å×½ºÆ® Çϱ⸦ ¿øÇϴ Ŭ·¡½º·Î ±× ¿¹¿Ü¸¦ ³ªÆ÷ÇÏ´Â °ÍÀÔ´Ï´Ù:

	def is_instance_of(the_instance, the_class):
	    try:
		raise the_instance
	    except the_class:
		return 1
	    except:
		return 0
ÀÌ Å×Å©´ÐÀº "subclassness"¸¦ Ŭ·¡½ºÀÇ ¸ðÀ½°ú ±¸º°ÇÏ´Â µ¥¿¡ ¿ª½Ã »ç¿ëµÉ ¼ö ÀÖ½À´Ï´Ù.

                try:
                              raise the_instance
                except Audible:
                              the_instance.play(largo)
                except Visual:
                              the_instance.display(gaudy)
                except Olfactory:
                              sniff(the_instance)
                except:
                              raise ValueError, "dunno what to do with this!"
ÀÌ°ÍÀº ¿¹¿Ü ³ªÆ÷°¡ Ŭ·¡½º ȤÀº ÇϺÎŬ·¡½º ±¸¼º¿øÀ» Å×½ºÆ®ÇÑ´Ù´Â »ç½ÇÀ» ÀÌ¿ëÇÕ´Ï´Ù.

´Ù¸¥ Á¢±Ù¹ýÀº ÁÖ¾îÁø Ŭ·¡½º¿¡ ´ëÇÏ¿© ¾Æ¸¶µµ À¯ÀÏÇÑ Å¬·¡½º ¼Ó¼ºÀÇ Á¸À縦 Å×½ºÆ®ÇÏ´Â °ÍÀÔ´Ï´Ù. ¿¹¸¦ µé¾î:

	class MyClass:
	    ThisIsMyClass = 1
	    ...
	def is_a_MyClass(the_instance):
	    return hasattr(the_instance, 'ThisIsMyClass')
ÀÌ ¹öÀüÀº ¶óÀγ»Àå(inline)ÇϱⰡ ´õ ½¬¿ì¸ç, ´õ¿í ºü¸¦ °ÍÀÔ´Ï´Ù (¶óÀγ»ÀåµÇ¸é(inlined) È®½ÇÈ÷ ´õ ºü¸¨´Ï´Ù). ´ÜÁ¡Àº ´Ù¸¥ ¾î¶² »ç¶÷ÀÌ ´ÙÀ½°ú °°ÀÌ ¼ÓÀÏ ¼ö°¡ ÀÖ´Ù´Â °ÍÀÔ´Ï´Ù:

	class IntruderClass:
	    ThisIsMyClass = 1    # Masquerade as MyClass
	    ...
±×·¯³ª ÀÌ°ÍÀº ÇϳªÀÇ »ç¾çÀ¸·Î¼­ °£ÁÖµÉ ¼ö ÀÖ½À´Ï´Ù (¾î¶µç, ÆÄÀ̽㿡´Â ¼ÓÀÏ ¼ö ÀÖ´Â ¼ö ¸¹Àº ´Ù¸¥ ¹æ¹ýµéÀÌ ÀÖ½À´Ï´Ù). ¶Ç ´Ù¸¥ ´ÜÁ¡Àº ±× Ŭ·¡½º°¡ ±¸¼º¿ø(membership) Å×½ºÆ®¸¦ À§ÇØ ¹Ì¸® ÁغñµÇ¾î¾ß ÇÑ´Ù´Â °ÍÀÔ´Ï´Ù. ¸¸¾à ±× Ŭ·¡½º¸¦ À§ÇØ "¼Ò½º Äڵ带 Á¦¾îÇÏÁö ¾Ê´Â´Ù¸é" ±× Ŭ·¡½º¸¦ º¯°æÇÏ¿© Å×½ºÆ®°¡´ÉÇϵµ·Ï Áö¿øÇÏ´Â °ÍÀº ±ÇÀåÇÒ ¼ö ¾ø½À´Ï´Ù.


4.48. À§ÀÓÀ̶õ ¹«¾ùÀΰ¡¿ä?

À§ÀÓ(Delegation)À̶õ °´Ã¼ ÁöÇâ Å×Å©´ÐÀ» ÁöĪÇÏ´Â °ÍÀ¸·Î¼­ ÆÄÀ̽ã ÇÁ·Î±×·¡¸ÓµéÀÌ Æ¯º°ÇÑ ÆíÀǸ¦ À§ÇØ ±¸ÇöÇÕ´Ï´Ù. ´ÙÀ½À» ¿¬±¸ÇØ º¸¼¼¿ä:

  from string import upper
  class UpperOut:
        def __init__(self, outfile):
              self.__outfile = outfile
        def write(self, str):
              self.__outfile.write( upper(str) )
        def __getattr__(self, name):
              return getattr(self.__outfile, name)
¿©±â¿¡¼­ UpperOut Ŭ·¡½º´Â write ¸Þ½îµå¸¦ ÀçÁ¤ÀÇÇÏ¿© ¾Æ·¡ÀÇ self.__outfile.write ¸Þ½îµå¸¦ È£ÃâÇϱâ Àü¿¡ Àμö ¹®ÀÚ¿­À» ´ë¹®ÀÚ·Î º¯È¯ÇÕ´Ï´Ù, ±×·¯³ª ¸ðµç ´Ù¸¥ ¸Þ½îµåµéÀº ¾Æ·¡ÀÇ self.__outfile °´Ã¼¿¡ À§Àӵ˴ϴÙ. À§ÀÓ(delegation)Àº "¸¶¹ýÀÇ" __getattr__ ¸Þ½îµå·Î ´Þ¼ºµË´Ï´Ù. ÀÌ ¸Þ½îµåÀÇ »ç¿ë¹ý¿¡ °üÇÏ¿© ´õ ¸¹Àº Á¤º¸¸¦ ¿øÇÏ½Ã¸é ¾ð¾î ÂüÁ¶¼­¸¦ º¸¼¼¿ä.

´õ¿í ÀϹÝÀûÀÎ °æ¿ì¿¡ ´ëÇؼ­´Â À§ÀÓ(delegation)Àº ²Ä¼öÀûÀÏ ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ¼Ó¼ºÀ» ¼³Á¤Çϰųª ȹµæÇؾ߸¸ ÇÒ ¶§´Â, ±× Ŭ·¡½º´Â ¹Ýµå½Ã __settattr__ ¸Þ½îµåµµ ¿ª½Ã Á¤ÀÇÇØ¾ß ÇÕ´Ï´Ù, ±×¸®°í ´ë´ÜÈ÷ ÁÖÀDZí°Ô ±×·¸°Ô Çؾ߸¸ ÇÕ´Ï´Ù.

__setattr__ÀÇ ±âº»ÀûÀÎ ±¸ÇöÀº ´ÙÀ½°ú ´ëüÀûÀ¸·Î µ¿µîÇÕ´Ï´Ù:

   class X:
        ...
        def __setattr__(self, name, value):
             self.__dict__[name] = value
        ...
´ëºÎºÐÀÇ __setattr__ ±¸ÇöÀº self.__dict__¸¦ º¯°æÇÏ¿© ¹«ÇÑ Àç±Í¸¦ ¾ß±âÇÏÁö ¾Ê°í¼­ self¿¡ ´ëÇÑ Áö¿ª »óŸ¦ ÀúÀåÇÏ¿©¾ß ÇÕ´Ï´Ù.


4.49. ¾î¶»°Ô ÆÄÀ̽ã ÇÁ·Î±×·¥ ȤÀº ÄÄÆ÷³ÍÆ®¸¦ Å×½ºÆ®Çϳª¿ä.

¿ì¸®°¡ ¿¹»óÇϱâ·Î´Â ÀÌ Áú¹®ÀÇ ¸ñÀûÀ¸·Î ¿©·¯ºÐÀº Å×½ºÆ® ÇÁ·¹ÀÓ¿öÅ© ¾È¿¡¼­ ÄÄÆ÷³ÍÆ®¸¦ Å×½ºÆ® ÇÏ´Â °Íº¸´Ù´Â, µ¶¸³ÀûÀÎ Å×½ºÆ®¿¡ °ü½ÉÀ» °¡Áö°í ÀÖÀ» °ÍÀÔ´Ï´Ù. °¡Àå ÈǸ¢ÇÏ´Ù°í ¾Ë·ÁÁø Å×½ºÆ® ÇÁ·¹ÀÓ¿öÅ©´Â PyUnit ¸ðµâÀ̸ç, ´ÙÀ½¿¡¼­ À¯ÁöµÇ°í ÀÖ½À´Ï´Ù.

    http://pyunit.sourceforge.net//
µ¶¸³ÀûÀÎ Å×½ºÆ®¸¦ À§Çؼ­´Â, ÈǸ¢ÇÑ ¸ðµâ µðÀÚÀÎÀ» »ç¿ëÇÏ¿©, ½±°Ô Å×½ºÆ® µÉ ¼ö ÀÖµµ·Ï, ÇÁ·Î±×·¥À» ÀÛ¼ºÇÏ´Â °ÍÀÌ µµ¿òÀÌ µË´Ï´Ù. ƯÈ÷ ÇÁ·Î±×·¥Àº °ÅÀÇ ¸ðµç ±â´ÉÀ» ÇÔ¼ö³ª ȤÀº Ŭ·¡½º ¸Þ½îµå¿¡ ĸ½¶È­ÇØ¾ß ÇÕ´Ï´Ù -- ±×¸®°í ÀÌ°ÍÀº ¶§·Î ±× ÇÁ·Î±×·¥À» ´õ ºü¸£°Ô ¸¸µå´Â ³î¶ó¿î ±×¸®°í ±â»Ý ³ÑÄ¡´Â È¿°ú¸¦ °¡Áý´Ï´Ù. (¿Ö³ÄÇϸé Áö¿ª º¯¼ö´Â Àü¿ª º¯¼öº¸´Ù ´õ ºü¸£±â ¶§¹®ÀÔ´Ï´Ù). °Ô´Ù°¡ ÇÁ·Î±×·¥Àº º¯°æµÇ´Â Àü¿ª º¯¼ö¿¡ ÀÇÁ¸ÇÏ´Â °ÍÀ» ÇÇÇØ¾ß ÇÕ´Ï´Ù, ¿Ö³ÄÇϸé ÀÌ°ÍÀº Å×½ºÆ®¸¦ ´õ¿í ´õ ¾î·Æ°Ô Çϱ⠶§¹®ÀÔ´Ï´Ù.

ÇÁ·Î±×·¥ÀÇ "Àü¿ªÀû ÁÖ ³í¸®±¸¼º(global main logic)"Àº ´ÙÀ½°ú °°ÀÌ °£°áÇÕ´Ï´Ù.

  if __name__=="__main__":
       main_logic()
ÇÁ·Î±×·¥ÀÇ ÁÖ ¸ðµâÀÌ ÃÖÇÏÀ§¿¡ ÀÖ½À´Ï´Ù.

ÇÁ·Î±×·¥ÀÌ ÇÔ¼ö¿Í Ŭ·¡½º ÇàÀ§µéÀÇ °¡½ÃÀûÀÎ ¸ðÀÓÀ¸·Î Á¶Á÷µÇ°í ³ª¸é ±× ÇàÀ§µéÀ» ¿¬½À½ÃÄÑ º¸´Â Å×½ºÆ® ÇÔ¼ö¸¦ ÀÛ¼ºÇÏ¿©¾ß ÇÕ´Ï´Ù. Å×½ºÆ® ¸ðµÒÀº ÀÏ·ÃÀÇ Å×½ºÆ®¸¦ ÀÚµ¿È­ÇÏ´Â °¢ ¸ðµâ°ú °áÇÕµÉ ¼ö ÀÖ½À´Ï´Ù. ÀÌ°ÍÀº ¾öû ¸¹Àº ÀÛ¾÷°°ÀÌ µé¸®Áö¸¸, ÆÄÀ̽ãÀº °£°áÇÏ°í À¯¿¬ÇϹǷΠ³î¶øµµ·Ï ½±½À´Ï´Ù. Å×½ºÆ® ÇÔ¼ö¸¦ "»ý»ê ÄÚµå(production code)"¿Í µ¿½Ã¿¡ ÀÛ¼ºÇÏ°Ô µÇ¸é ´õ¿í ½±°í Àç¹ÌÀÖ°Ô ÄÚµùÇÒ ¼ö ÀÖ½À´Ï´Ù, ¿Ö³ÄÇϸé ÀÌ·¸°Ô ÇÏ¸é ¹ö±×¸¦ ½±°Ô ¹ß°ßÇÒ ¼ö ÀÖ°í ½ÉÁö¾î´Â µðÀÚÀÎ °áÇÔÀ» Á¶±â¿¡ ¹ß°ßÇÒ ¼ö Àֱ⠶§¹®ÀÔ´Ï´Ù.

ÇÁ·Î±×·¥ÀÇ ÁÖ ¸ðµâ·Î ¾²ÀÌÁö ¾ÊÀ» "Áö¿ø ¸ðµâ(Support modules)"Àº ±× ¸ðµâÀÇ ÀÚü Å×½ºÆ®¸¦ ¿äûÇÏ´Â "Å×½ºÆ® ½ºÅ©¸³Æ® ¹ø¿ª(test script interpretation)"À» Æ÷ÇÔÇÒ ¼ö ÀÖ½À´Ï´Ù.

   if __name__ == "__main__":
      self_test()
½ÉÁö¾î´Â º¹ÀâÇÑ ¿ÜºÎ ÀÎÅÍÆäÀ̽º¿Í ÀÛµ¿ÇÏ´Â ÇÁ·Î±×·¥Á¶Â÷µµ, ±× ¿ÜºÎ ÀÎÅÍÆäÀ̽º°¡ »ç¿ëºÒ°¡´ÉÇÒ ¶§, ÆÄÀ̽ãÀ¸·Î ±¸ÇöµÈ "¸ðÁ¶" ÀÎÅÍÆäÀ̽º¸¦ »ç¿ëÇÏ¿© Å×½ºÆ® µÉ ¼ö ÀÖ½À´Ï´Ù, ´ÙÀ½ Ŭ·¡½º´Â (ºÎºÐÀûÀÎ) "¸ðÁ¶(fake)" ÆÄÀÏ ÀÎÅÍÆäÀ̽º¸¦ Á¤ÀÇÇÏ°í ÀÖ½À´Ï´Ù:

 import string
 testdata = "just a random sequence of characters"
 class FakeInputFile:
   data = testdata
   position = 0
   closed = 0
   def read(self, n=None):
       self.testclosed()
       p = self.position
       if n is None:
          result= self.data[p:]
       else:
          result= self.data[p: p+n]
       self.position = p + len(result)
       return result
   def seek(self, n, m=0):
       self.testclosed()
       last = len(self.data)
       p = self.position
       if m==0:
          final=n
       elif m==1:
          final=n+p
       elif m==2:
          final=len(self.data)+n
       else:
          raise ValueError, "bad m"
       if final<0:
          raise IOError, "negative seek"
       self.position = final
   def isatty(self):
       return 0
   def tell(self):
       return self.position
   def close(self):
       self.closed = 1
   def testclosed(self):
       if self.closed:
          raise IOError, "file closed"
f=FakeInputFile()À» ½ÃµµÇØ º¸°í ±× ¿¬»êÀ» Å×½ºÆ® ÇØ º¸¼¼¿ä.


4.50. ´ÙÂ÷¿ø ¸®½ºÆ® (array)°¡ ±úÁ³½À´Ï´Ù! ¾îÂîµÈ ÀÏÀÎÁö¿ä?

¾Æ¸¶µµ ´ÙÂ÷¿ø ¹è¿­À» ´ÙÀ½°ú °°Àº ¹æ½ÄÀ¸·Î ½ÃµµÇϽŠ°Í °°½À´Ï´Ù.

   A = [[None] * 2] * 3
ÀÌ°ÍÀº ±æÀÌ 2ÀÎ °°Àº ¸®½ºÆ®¿¡ ´ëÇÑ ¼¼°³ÀÇ ÂüÁ¶Á¡À» Æ÷ÇÔÇÏ´Â ¸®½ºÆ®¸¦ »ý¼ºÇÕ´Ï´Ù. ÇÑ ÁÙ¿¡ ´ëÇÑ º¯°æÀº ¸ðµç ÁÙ¿¡¼­ º¸¿©Áú °ÍÀÔ´Ï´Ù, ¾Æ¸¶µµ ¿øÇϽô ¹Ù°¡ ¾Æ´Ò °ÍÀÔ´Ï´Ù. ´ÙÀ½ÀÌ ÈξÀ ´õ Àß ÀÛµ¿ÇÕ´Ï´Ù:

   A = [None]*3
   for i in range(3):
        A[i] = [None] * 2
ÀÌ°ÍÀº ±æÀÌ 2ÀÎ 3 °³ÀÇ ¼­·Î ´Ù¸¥ ¸®½ºÆ®¸¦ Æ÷ÇÔÇÏ´Â ¸®½ºÆ®¸¦ ¸¸µé¾î ³À´Ï´Ù.

±«ÀÌÇÏ´Ù°í ´À³¤´Ù¸é, ´ÙÀ½°ú °°Àº ¹æ½ÄÀ¸·Î ÇØ º¼ ¼öµµ ÀÖ½À´Ï´Ù:

   w, h = 2, 3
   A = map(lambda i,w=w: [None] * w, range(h))
ÆÄÀ̽ã 2.0¿¡¼­´Â À§ÀÇ ¶óÀÎÀº ¸®½ºÆ® ¹ø¿ªÀ» »ç¿ëÇÏ¿© Ç¥±âµÉ ¼öµµ ÀÖ½À´Ï´Ù:

   w,h = 2,3
   A = [ [None]*w for i in range(h) ]


4.51. º¹ÀâÇÑ Á¤·ÄÀ» ÇÏ·Á°í ÇÕ´Ï´Ù: ½´¹ÙÂî¾ð º¯Çü(Schwartzian Transform)À» ÆÄÀ̽㿡¼­ ÇÒ ¼ö ÀÖ½À´Ï±î?

³×, ±×¸®°í ÆÄÀ̽㿡¼­ ´Ü Çѹø¸¸ ÀÛ¼ºÇÏ½Ã¸é µË´Ï´Ù:

 def st(List, Metric):
     def pairing(element, M = Metric):
           return (M(element), element)
     paired = map(pairing, List)
     paired.sort()
     return map(stripit, paired)
 def stripit(pair):
     return pair[1]
ÀÌ Å×Å©´ÐÀº, ·£µé ½´¹Ù¸£Âê(Randal Schwartz)ÀÇ ´öºÐÀ¸·Î, °¢ ¿ä¼Ò¸¦ ±×ÀÇ "Á¤·Ä °ª(sort value)"¿¡ ¦Áö¾îÁÖ´Â ¹æ½ÄÀ¸·Î ¸®½ºÆ®ÀÇ ¿ä¼ÒµéÀ» Á¤·ÄÇÕ´Ï´Ù. ¿¹¸¦ µé¾î, ¸¸¾à LÀÌ ¹®ÀÚ¿­À» ´ãÀº ¸®½ºÆ®¶ó¸é

   import string
   Usorted = st(L, string.upper)
   def intfield(s):
         return string.atoi( string.strip(s[10:15] ) )
   Isorted = st(L, intfield)
Usorted´Â LÀÇ ¿ä¼ÒµéÀ» ¸¶Ä¡ ´ë¹®ÀÚÀÎ °Íó·³ Á¤·ÄÇÏ¿© »êÃâÇÏ°í, ±×¸®°í Isorted´Â LÀÇ ¿ä¼ÒµéÀ» Á¤¼ö °ªµé¿¡ ÀÇÇؼ­ Á¤·ÄÇÏ¿© »êÃâÇϴµ¥ ±× Á¤¼ö°ªµéÀº À§Ä¡ 10¿¡¼­ ½ÃÀÛÇÏ¿© À§Ä¡ 15¸¦ ¸¶Áö¸·À¸·Î ½ä¾î ³õÀº ¹®ÀÚ¿­ Á¶°¢¿¡ ³ªÅ¸³³´Ï´Ù. ÆÄÀ̽ã 2.0¿¡¼­ ÀÌ°ÍÀº ¸®½ºÆ® ¹ø¿ªÀ¸·Î ´õ ÀÚ¿¬½º·´°Ô ´Þ¼ºµÉ ¼ö ÀÖ½À´Ï´Ù:

  import string
  tmp1 = [ (string.upper(x),x) for x in L ] # Schwartzian transform
  tmp1.sort()
  Usorted = [ x[1] for x in tmp1 ]
  tmp2 = [ (int(s[10:15]), s) for s in L ] # Schwartzian transform
  tmp2.sort()
  Isorted = [ x[1] for x in tmp2 ]

ÁÖ¸ñÇÒ °ÍÀº Isorted´Â ´ÙÀ½°ú °°ÀÌ °è»êµÉ ¼öµµ ÀÖ½À´Ï´Ù

   def Icmp(s1, s2):
         return cmp( intfield(s1), intfield(s2) )
   Isorted = L[:]
   Isorted.sort(Icmp)
±×·¯³ª ÀÌ ¸Þ½îµå´Â LÀÇ °¢ ¿ä¼Òµé¿¡ ´ëÇÏ¿© ¿©·¯¹ø intfield¸¦ °è»êÇϱ⠶§¹®¿¡, ½´¹ÙÂî¾ð º¯Çüº¸´Ù´Â ´õ ´À¸³´Ï´Ù.


4.52. ÅÍÇðú ¸®½ºÆ® »çÀ̸¦ º¯È¯ÇÏ´Â ¹ý?

ÇÔ¼ö tuple(seq)´Â ÀÓÀÇÀÇ ¿¬¼Ó¿­À» °°Àº ¼ø¼­ÀÇ °°Àº Ç׸ñÀ» °¡Áö´Â ÅÍÇ÷Πº¯È¯ÇÕ´Ï´Ù. ¿¹¸¦ µé¾î, tuple([1, 2, 3])Àº (1, 2, 3) À» »êÃâÇÏ°í tuple('abc')´Â ('a', 'b', 'c')¸¦ »êÃâÇÕ´Ï´Ù. ¸¸¾à ±× Àμö°¡ ÅÍÇÃÀ̶ó¸é, º¹»çº»À» ¸¸µéÁö ¾Ê°í °°Àº °´Ã¼¸¦ ¹ÝȯÇÕ´Ï´Ù, ±×·¡¼­ ÇÑ °´Ã¼°¡ ÀÌ¹Ì ÅÍÇÃÀÎÁö È®½ÅÇÏÁö ¸øÇÒ ¶§´Â tuple()À» È£ÃâÇÏ´Â °ÍÀÌ ¾ÈÀüÇÕ´Ï´Ù.

ÇÔ¼ö list(seq)´Â ÀÓÀÇÀÇ ¿¬¼Ó¿­À» °°Àº ¼ø¼­ÀÇ °°Àº Ç׸ñÀ» °¡Áö´Â ¸®½ºÆ®·Î º¯È¯ÇÕ´Ï´Ù. ¿¹¸¦ µé¾î, list((1, 2, 3))Àº [1, 2, 3]¸¦ »êÃâÇÏ°í list('abc')´Â ['a', 'b', 'c']¸¦ »êÃâÇÕ´Ï´Ù. ¸¸¾à ±× Àμö°¡ ¸®½ºÆ®¶ó¸é, seq[:]¿Í ¸¶Âù°¡Áö·Î º¹»çº»À» ¸¸µì´Ï´Ù.


4.53. urllibÀ¸·Î ¿­¾îº» ÆÄÀϵ鿡 À̲ô´Â ¾²·¹±â°¡ Æ÷ÇԵǾî ÀÖ½À´Ï´Ù. ÀüÀÚ¸ÞÀÏ ¸Ó¸®ºÎ¿Í °°ÀÌ º¸ÀÔ´Ï´Ù.

¾öû³ª°Ô ¿À·¡µÈ ÆÄÀ̽㠹öÀü¿¡¼­´Â HTTP/1.1À» Áö¿øÇÏÁö ¾Ê´Â ¶óÀ̺귯¸®¸¦ Á¦°øÇß½À´Ï´Ù; ÆÄÀ̽ã 1.4¿¡ ÀÖ´Â ¹Ù´Ò¶ó( vanilla) httplib´Â ¿À·ÎÁö HTTP/1.0¸¸À» ÀνÄÇÕ´Ï´Ù. ÆÄÀ̽ã 2.0¿¡¼­ ¿ÏÀüÇÑ HTTP/1.1 Áö¿øÀÌ Æ÷ÇԵǾú½À´Ï´Ù.


4.54. ÁÖ¾îÁø Ŭ·¡½º¿¡¼­ ¸ðµç ½ÇüµéÀÇ ¸ñ·ÏÀ» ¾î¶»°Ô ¾ò³ª¿ä?

ÆÄÀ̽ãÀº ÇÑ Å¬·¡½ºÀÇ (ȤÀº ³»Àå ÇüÀÇ) ¸ðµç ½ÇüµéÀ» ÃßÀûÇÏÁö ¾Ê½À´Ï´Ù.

±× Ŭ·¡½ºÀÇ ±¸¼ºÀÚ¸¦ ÇÁ·Î±×·¥ÇÏ¿© ¸ðµç ½ÇüµéÀ» ÃßÀûÇϵµ·Ï ÇÒ ¼ö ÀÖ½À´Ï´Ù, ±×·¯³ª ¿©·¯ºÐÀÌ ´ë´ÜÈ÷ ¶È¶ÈÇÏÁö ¾Ê´Ù¸é, ÀÌ°ÍÀÇ ´ÜÁ¡Àº ±× ½ÇüµéÀÌ Àý´ë·Î »èÁ¦µÇÁö ¾Ê´Â´Ù´Â °ÍÀε¥, ¸ðµç ½ÇüµéÀ» ´ãÀº ¸®½ºÆ®°¡ ±× ½ÇüµéÀÇ ÂüÁ¶¸¦ À¯ÁöÇÏ°í Àֱ⠶§¹®ÀÔ´Ï´Ù.

(ÀÌ ²Ä¼ö´Â È®º¸ÇÏ°í ÀÖ´Â ½ÇüµéÀÇ ÂüÁ¶ Ƚ¼ö¸¦ Á¤±âÀûÀ¸·Î µé¿©´Ù º¸´Â °ÍÀε¥, ¸¸¾à ÂüÁ¶ Ƚ¼ö°¡ ÀÏÁ¤ ¼öÁØ ÀÌÇ϶ó¸é, ±×°ÍÀ» ¸®½ºÆ®·ÎºÎÅÍ Á¦°ÅÇÕ´Ï´Ù. ±× ¼öÁØÀ» °áÁ¤ÇÏ´Â °ÍÀº ²Ä¼öÀûÀÔ´Ï´Ù -- ºÐ¸íÈ÷ 1 º¸´Ù´Â Å©°ÚÁö¿ä.)


4.55. Á¤±Ô Ç¥Çö½ÄÀÌ regex.error·Î ½ÇÆÐÇÕ´Ï´Ù: ÀÏÄ¡ ½ÇÆÐ(match failure).

ÀÌ°ÍÀº º¸Åë ³Ê¹« ¸¹Àº ¿ªÃßÀûÀ¸·Î ÀÎÇÏ¿© ¾ß±âµË´Ï´Ù; Á¤±Ô Ç¥Çö½Ä ¿£ÁøÀº °íÁ¤µÈ Å©±âÀÇ ½ºÅÃÀ» °¡Áö¸ç ±â²¯ÇØ¾ß 4000 °³ÀÇ ¿ªÃßÀû Á¡À» º¸À¯ÇÒ »ÓÀÔ´Ï´Ù. ¿¹¸¦µé¾î ".*"¿¡ ÀÇÇؼ­ ÀÏÄ¡µÇ´Â °¢°¢ÀÇ ¸ðµç ¹®ÀÚµéÀº ¿ªÃßÀû Á¡À» ³ªÅ¸³À´Ï´Ù, ±×·¡¼­ ´ÙÀ½°ú °°ÀÌ °£´ÜÇÑ Å½»öÁ¶Â÷µµ

  regex.match('.*x',"x"*5000)
½ÇÆÐÇÒ °ÍÀÔ´Ï´Ù.

ÀÌ°ÍÀº ÆÄÀ̽ã 1.5¿¡ µµÀÔµÈ re ¸ðµâ¿¡¼­ °íÃÄÁ³½À´Ï´Ù; ´õ Á¤º¸¸¦ ¿øÇϽøé re¿¡ °üÇÑ ¶óÀ̺귯¸® ÂüÁ¶ ¼½¼ÇÀ» Âü°íÇϼ¼¿ä.


4.56. ½ÅÈ£ ó¸®ÀÚ¸¦ ÀÛµ¿½Ãų ¼ö ¾ø½À´Ï´Ù.

°¡Àå ÈçÇÑ ¹®Á¦´Â ±× ½ÅÈ£ ó¸®ÀÚ°¡ À߸øµÈ Àμö ¸®½ºÆ®·Î ¼±¾ðµÇ¾ú´Ù´Â °ÍÀÔ´Ï´Ù. ±×°ÍÀº ´ÙÀ½°ú °°ÀÌ È£ÃâµË´Ï´Ù

	handler(signum, frame)
±×·¡¼­ ÀÌ°ÍÀº µÎ °³ÀÇ Àμö·Î ¼±¾ðµÇ¾î¾ß ÇÕ´Ï´Ù:

	def handler(signum, frame):
		...


4.57. ÇÔ¼ö¿¡¼­ Àü¿ª º¯¼ö¸¦ »ç¿ëÇÒ ¼ö ¾ø½À´Ï´Ù? µµ¿ÍÁÖ¼¼¿ä!

´ÙÀ½°ú °°ÀÌ Çϼ̳ª¿ä?

   x = 1 # make a global
   def f():
         print x # try to print the global
         ...
         for j in range(100):
              if q>3:
                 x=4
ÇÔ¼ö¾È¿¡ ÇÒ´çµÈ ¾î¶² º¯¼öµµ Ưº°ÇÏ°Ô Àü¿ªÀ¸·Î ¼±¾ðµÇÁö ¾Ê´Â ÇÑ ±× ÇÔ¼ö¿¡ ´ëÇÏ¿© Áö¿ªÀûÀÔ´Ï´Ù. ÇϳªÀÇ °ªÀÌ ±× ÇÔ¼ö ¸öüÀÇ ¸¶Áö¸· ¼­¼ú¹®À¸·Î x ¿¡ ¿«¿© ÀÖÀ¸¹Ç·Î, ÄÄÆÄÀÏ·¯´Â x °¡ Áö¿ªÀûÀ̶ó°í °£ÁÖÇÕ´Ï´Ù. °á°úÀûÀ¸·Î "print x"´Â ÃʱâÈ­ µÇÁö ¾ÊÀº Áö¿ª º¯¼ö¸¦ Ãâ·ÂÇÏ·Á°í ½ÃµµÇÏ°í NameError¸¦ Ã˹߽Ãų °ÍÀÔ´Ï´Ù.

±×·¯ÇÑ °æ¿ì¿¡ ÇØ°áÃ¥Àº ¸í½ÃÀûÀÎ Àü¿ª ¼±¾ðÀ» ±× ÇÔ¼öÀÇ Ã³À½¿¡ »ðÀÔÇÏ´Â °ÍÀÔ´Ï´Ù, ±×°ÍÀ» ¸¸µé¾î º¸¸é

   def f():
         global x
         print x # try to print the global
         ...
         for j in range(100):
              if q>3:
                 x=4

ÀÌ °æ¿ì¿¡, x ¿¡ ´ëÇÑ ¸ðµç ÂüÁ¶Á¡Àº ¸ðµâ À̸§°ø°£¿¡¼­ ¿Â x ¿¡ ´ëÇÑ ÂüÁ¶Á¡À¸·Î ÀÌÇص˴ϴÙ.


4.58. À½ÀÇ ÁöÇ¥¶õ ¹«¾ùÀΰ¡¿ä? ¿Ö list.insert()´Â ±×°ÍÀ» »ç¿ëÇÏÁö ¾Ê³ª¿ä?

ÆÄÀ̽ãÀÇ ¿¬¼Ó¿­Àº ¾ç¼ö¿Í À½¼ö·Î ÁöǥȭµË´Ï´Ù. ¾ç¼ö¿¡ ´ëÇؼ­´Â 0Àº ù ¹ø° ÁöÇ¥ÀÌ°í 1 Àº µÎ ¹ø° ÁöÇ¥ÀÌ°í µîµî ÀÔ´Ï´Ù. À½¼ö¿¡ ´ëÇؼ­´Â -1ÀÌ °¡Àå ¸¶Áö¸· ÁöÇ¥ÀÌ°í -2´Â ¿Ï¼ºÁ÷Àü (¸¶Áö¸· ¹Ù·Î Àü) ÁöÇ¥ÀÌ´Ù µîµîÀÔ´Ï´Ù. seq[-n]¸¦ seq[len(seq)-n]¿Í µ¿ÀÏÇÏ°Ô »ý°¢Çϼ¼¿ä.

À½¼ö ÁöÇ¥¸¦ »ç¿ëÇÏ¸é ´ë´ÜÈ÷ Æí¸®ÇÒ ¼ö ÀÖ½À´Ï´Ù. ¿¹¸¦ µé¾î ¹®ÀÚ¿­ LineÀÌ newlineÀ¸·Î ³¡³ª¸é Line[:-1]Àº ±× newlineÀ» »« LineÀÇ ¸ðµç °ÍÀÔ´Ï´Ù.

½½ÇÁ°Ôµµ ¸®½ºÆ® ³»Àå ¸Þ½îµå L.insert´Â À½ÀÇ ÁöÇ¥¸¦ ÁؼöÇÏÁö ¾Ê½À´Ï´Ù. ÀÌ »ç¾çÀº ½Ç¼ö¶ó°í »ý°¢µÇ¾îÁú ¼öµµ ÀÖ°ÚÁö¸¸ ½ÇÁ¸ÇÏ´Â ÇÁ·Î±×·¥µéÀÌ ÀÌ »ç¾ç¿¡ ÀÇÁ¸ÇÏ°í ÀÖÀ¸¹Ç·Î ¿À·§µ¿¾È À¯ÁöµÉ °Í °°½À´Ï´Ù. À½¼ö ÁöÇ¥¿¡ ´ëÇÑ L.insert´Â ±× ¸®½ºÆ®ÀÇ ½ÃÀۺο¡ »ðÀÔÇÕ´Ï´Ù. "ÀûÀýÇÑ" À½ÀÇ ÁöÇ¥ ÇàÀ§¸¦ ¾òÀ¸·Á¸é ±× insert ¸Þ½îµå ´ë½Å¿¡ L[n:n] = [x]À» »ç¿ëÇϼ¼¿ä.


4.59. ¾î¶»°Ô ÇϳªÀÇ ¸®½ºÆ®¸¦ ´Ù¸¥ ¸®½ºÆ®·ÎºÎÅÍ °ªÀ¸·Î Á¤·ÄÇÒ ¼ö ÀÖ³ª¿ä?

ÅÍÇÃÀ» ´ãÀº ¸®½ºÆ®¸¦ Á¤·ÄÇÒ ¼ö ÀÖ½À´Ï´Ù.

  >>> list1 = ["what", "I'm", "sorting", "by"]
  >>> list2 = ["something", "else", "to", "sort"]
  >>> pairs = map(None, list1, list2)
  >>> pairs
  [('what', 'something'), ("I'm", 'else'), ('sorting', 'to'), ('by', 'sort')]
  >>> pairs.sort()
  >>> pairs
  [("I'm", 'else'), ('by', 'sort'), ('sorting', 'to'), ('what', 'something')]
  >>> result = pairs[:]
  >>> for i in xrange(len(result)): result[i] = result[i][1]
  ...
  >>> result
  ['else', 'sort', 'to', 'something']
±×¸®°í ¹®Á¦¸¦ ÀÌÇØ ¸øÇÏ°Ú´Ù¸é, À§ÀÇ ¿¹Á¦¸¦ º¸¼¼¿ä;c). "I'm"ÀÌ "by" ¾Õ¿¡ Á¤·ÄµÈ´Ù´Â °ÍÀ» ÁÖ¸ñÇϼ¼¿ä. ¿Ö³ÄÇÏ¸é ¾Æ½ºÅ° ¼ø¼­·Î ´ë¹®ÀÚ "I"´Â ¼Ò¹®ÀÚ "b"ÀÇ ¾Õ¿¡ ¿À±â ¶§¹®ÀÔ´Ï´Ù. Áú¹® 4.51µµ ÂüÁ¶Çϼ¼¿ä.

ÆÄÀ̽ã 2.0¿¡¼­ ÀÌ°ÍÀº ´ÙÀ½°ú °°ÀÌ ÀÛ¼ºµÉ ¼ö ÀÖ½À´Ï´Ù:

 >>> list1 = ["what", "I'm", "sorting", "by"]
 >>> list2 = ["something", "else", "to", "sort"]
 >>> pairs = zip(list1, list2)
 >>> pairs
 [('what', 'something'), ("I'm", 'else'), ('sorting', 'to'), ('by', 'sort')]
 >>> pairs.sort()
 >>> result = [ x[1] for x in pairs ]
 >>> result
 ['else', 'sort', 'to', 'something']
[Followup]

¾î¶² »ç¶÷ÀÌ ¹°¾ú½À´Ï´Ù, ¸¶Áö¸· ´Ü°è¿¡ ´ëÇؼ­´Â ÀÌ°Ç ¾î¶§¿ä:

  result = []
  for p in pairs: result.append(p[1])
ÀÌ°ÍÀÌ ÈξÀ ´õ Àб⠽±½À´Ï´Ù. ±×·¸Áö¸¸, °£´ÜÇÏ°Ô Å×½ºÆ®ÇØ º» ¹Ù¿¡ ÀÇÇÏ¸é ±â´Ù¶õ ¸®½ºÆ®¿¡ ´ëÇؼ­´Â °ÅÀÇ µÎ ¹è³ª ´À¸®´Ù´Â °ÍÀ» ¾Ë¼ö ÀÖ½À´Ï´Ù. ¿ÖÀϱî¿ä? ¹«¾ùº¸´Ùµµ, append() ¿¬»êÀº ¸Þ¸ð¸®¸¦ ÀçÇÒ´çÇؾ߸¸ ÇÕ´Ï´Ù, ¾à°£ÀÇ ²Ä¼ö¸¦ »ç¿ëÇؼ­ ¸Å¹ø ±×·¸°Ô ÇÏ´Â °ÍÀ» ÇÇÇϱâ´Â ÇÏÁö¸¸, ¿©ÀüÈ÷ °¡²ûÀº ±×·¸°Ô Çؾ߸¸ ÇÕ´Ï´Ù, ±×¸®°í ºÐ¸íÈ÷ ±×°Í¶§¹®¿¡ ¸¹Àº ´ë°¡¸¦ Ä¡¸¨´Ï´Ù. µÎ¹ø°·Î, Ç¥Çö½Ä "result.append"´Â ¿©ºÐÀÇ ¼Ó¼º ÂüÁ¶¸¦ ÇÊ¿ä·Î ÇÕ´Ï´Ù. ¼Ó¼º ÂüÁ¶´Â ´ÙÀ½°ú °°ÀÌ ÀçÀÛ¼ºÇϰԵǸé Á¦°ÅµÉ ¼ö ÀÖ½À´Ï´Ù:

  result = []
  append = result.append
  for p in pairs: append(p[1])
ÀÌ°ÍÀº ÀÒ¾î¹ö¸° ¼Óµµ¸¦ ¾à°£ µÇã¾Æ ÁÖ±â´Â ÇÏÁö¸¸, ¿ø·¡ÀÇ ÇØ°áÃ¥ º¸´Ù´Â ¿©ÀüÈ÷ »ó´çÈ÷ ´À¸®¸ç, ÀüÇô ´ú º¹ÀâÇÏÁöµµ ¾Ê½À´Ï´Ù.


4.60. ¿Ö dir()ÀÌ ÆÄÀÏ°ú ¸®½ºÆ® °°Àº ³»Àå Çü¿¡ ´ëÇÏ¿© ÀÛµ¿ÇÏÁö ¾Ê³ª¿ä?

±×°ÍÀº ÆÄÀ̽ã 1.5¿¡¼­ºÎÅÍ ½ÃÀÛÇÏ¿´½À´Ï´Ù.

1.4¸¦ »ç¿ëÇϽøé, ÁÖ¾îÁø °´Ã¼°¡ ¾î¶² ¸Þ½îµå¸¦ Áö¿øÇÏ´Â Áö¸¦ __methods__ ¼Ó¼ºÀ» »ìÆ캽À¸·Î½á ¾Ë ¼ö ÀÖ½À´Ï´Ù:

    >>> List = []
    >>> List.__methods__
    ['append', 'count', 'index', 'insert', 'remove', 'reverse', 'sort']


4.61. ¾î¶»°Ô CGI Æû Á¦ÃâÀ» Èä³»³¾ ¼ö ÀÖ³ª¿ä (METHOD=POST)?

ÆûÀ» Á¦Ãâ(POSTing)ÇÑ °á°ú·Î ³ª¿Â À¥ ÆäÀÌÁö¸¦ ¿­¶÷ÇÏ°í ½Í½À´Ï´Ù. ÀÌ°ÍÀ» ½±°Ô ÇÒ ¼ö ÀÖµµ·Ï ÇØÁÖ´Â Äڵ尡 Á¸ÀçÇϳª¿ä?

³×, ¿©±â¿¡ httplib¸¦ »ç¿ëÇÏ´Â °£´ÜÇÑ ¿¹Á¦°¡ ÀÖ½À´Ï´Ù.

#!/usr/local/bin/python
import httplib, sys, time
### build the query string
    qs = "First=Josephine&MI=Q&Last=Public"
### connect and send the server a path
    httpobj = httplib.HTTP('www.some-server.out-there', 80)
    httpobj.putrequest('POST', '/cgi-bin/some-cgi-script')
    ### now generate the rest of the HTTP headers...
    httpobj.putheader('Accept', '*/*')
    httpobj.putheader('Connection', 'Keep-Alive')
    httpobj.putheader('Content-type', 'application/x-www-form-urlencoded')
    httpobj.putheader('Content-length', '%d' % len(qs))
    httpobj.endheaders()
    httpobj.send(qs)
    ### find out what the server said in response...
    reply, msg, hdrs = httpobj.getreply()
    if reply != 200:
	sys.stdout.write(httpobj.getfile().read())
ÁÖ¸ñÇÒ °ÍÀº ÀϹÝÀûÀ¸·Î "url·Î ÄÚµå ÀüȯµÈ Á¦Ãâ(url encoded posts)"¿¡ ´ëÇؼ­´Â (±âº») ÁúÀÇ ¹®ÀÚ¿­ÀÌ ¹Ýµå½Ã "ÀοëºÎȣȭ µÇ¾î" , ¿¹¸¦ µé¸é, µ¿µî »çÀÎ(equals signs) ȤÀº °ø¹éÀÌ À̸§ ȤÀº °ª¿¡¼­ ³ªÅ¸³¯ ¶§ ÄÚµåÀüȯµÈ ÇüÅ·Πº¯°æµÇ¾î¾ß ÇÑ´Ù´Â °ÍÀÔ´Ï´Ù. urllib.quote¸¦ »ç¿ëÇؼ­ ÀÌ ÀοëºÎÈ£ ºÙÀ̱⸦ ¼öÇàÇϼ¼¿ä. ¿¹¸¦ µé¾î name="Guy Steele, Jr."¸¦ º¸³»·Á¸é:

>>> from urllib import quote
   >>> x = quote("Guy Steele, Jr.")
   >>> x
   'Guy%20Steele,%20Jr.'
   >>> query_string = "name="+x
   >>> query_string
   'name=Guy%20Steele,%20Jr.'


4.62. bsddb (ȤÀº anydbm) µ¥ÀÌŸº£À̽º°¡ ¿­¸± ¶§ ³ªÀÇ ÇÁ·Î±×·¥ÀÌ Ãæµ¹Çϸé, µ¥ÀÌŸ º£À̽º°¡ ±úÁ®¹ö¸³´Ï´Ù. ¿Ö ±×·±Áö¿ä?

bsddb°ú ÇÔ²² ¾²±â Á¢±ÙÀ¸·Î ¿­¸° µ¥ÀÌŸº£À̽º´Â (±×¸®°í ¶§·Î´Â anydbm ¸ðµâ¿¡ ÀÇÇؼ­ ¿­¸®´Âµ¥, ¿Ö³ÄÇÏ¸é ¿ì¼±ÀûÀ¸·Î bsddb¸¦ »ç¿ëÇÒ °ÍÀ̱⠶§¹®ÀÔ´Ï´Ù) ±× µ¥ÀÌŸº£À̽ºÀÇ close ¸Þ½îµå¸¦ »ç¿ëÇÏ¿© ¹Ýµå½Ã ¸í½ÃÀûÀ¸·Î ´ÝÇô¾ß ÇÕ´Ï´Ù. ±âÀúÀÇ libdb ÆÐÅ°Áö´Â µ¥ÀÌŸº£À̽º ³»¿ëÀ» ÀÓ½ÃÀúÀåÇϴµ¥ µð½ºÅ©-»óÀÇ ÇüÅ·Πº¯°æµÇ¾î ¾º¿©Áö´Âµ¥ ÇÊ¿äÇÕ´Ï´Ù. ÀϹÝÀûÀ¸·Î ¿­¸° ÆÄÀÏÀº ÀÌ¿Í´Â ´Þ¶ó¼­, Ä¿³ÎÀÇ ¾²±â ¹öÆÛ¿¡ µð½ºÅ©-»ó ºñÆ®¸¦ ÀÌ¹Ì °¡Áö°í ÀÖÀ¸¸ç, ÇÁ·Î±×·¥ÀÌ Á¾·áÇÒ ¶§ Ä¿³Î¿¡ ÀÇÇؼ­ ´ÜÁö ´ýÇÁµÉ ¼ö¸¸ ÀÖ½À´Ï´Ù.

¸¸¾à »õ·Î¿î bsddb µ¥ÀÌŸº£À̽º¸¦ ÃʱâÈ­ÇÏ¿´À¸³ª ±× ÇÁ·Î±×·¥ÀÌ Ãæµ¹Çϱâ Àü¿¡ ¾Æ¹«°Íµµ ¾²Áö ¾Ê¾Ò´Ù¸é, °¡²ûÀº ±æÀÌ-0ÀÎ ÆÄÀÏÀ» °¡Áö°Ô µÇ°í ´ÙÀ½¿¡ ±× ÆÄÀÏÀ» ¿­¶§´Â ¿¹¿Ü¸¦ ¸¸³ª°Ô µÉ °ÍÀÔ´Ï´Ù.


4.63. ÆÄÀ̽㠽ºÅ©¸³Æ®¸¦ À¯´Ð½º¿¡¼­ ¾î¶»°Ô ½ÇÇà°¡´ÉÇϵµ·Ï ¸¸µå³ª¿ä?

µÎ °¡Áö¸¦ ó¸®ÇÒ ÇÊ¿ä°¡ ÀÖ½À´Ï´Ù: ½ºÅ©¸³Æ® ÆÄÀÏÀÇ ¸ðµå´Â ½ÇÇà°¡´ÉÀ¸·Î ¼³Á¤µÇ¾î ÀÖ¾î¾ß ÇÏ°í ( 'x' ºñÆ®¸¦ Æ÷ÇÔÇÏ¿©), ±×¸®°í ù ¹øÀç ¶óÀÎÀº ¹Ýµå½Ã #!·Î ½ÃÀÛµÇ°í ´ÙÀ½¿¡ ÆÄÀ̽ã ÀÎÅÍÇÁ¸®ÅÍ¿¡ ´ëÇÑ °æ·Î¸íÀÌ µû¶ó¿Í¾ß ÇÕ´Ï´Ù.

ù ¹ø°´Â 'chmod +x scriptfile' ¶Ç´Â 'chmod 755 scriptfile'¸¦ ½ÇÇàÇÔÀ¸·Î½á ´Þ¼ºµË´Ï´Ù.

µÎ ¹ø°´Â ¿©·¯ ¹æ½ÄÀ¸·Î ´Þ¼ºµÉ ¼ö ÀÖ½À´Ï´Ù. °¡Àå ½¬¿î ¹æ¹ýÀº ´ÙÀ½°ú °°Àº ¶óÀÎÀ»

  #!/usr/local/bin/python
ÆÄÀÏÀÇ ¹Ù·Î ù ¹ø° ¶óÀÎÀ» ÀÛ¼ºÇÏ´Â °ÍÀÔ´Ï´Ù - ¶Ç´Â ÆÄÀ̽ã ÀÎÅÍÇÁ¸®ÅÍ°¡ ¿©·¯ºÐÀÇ Ç÷§Æû¿¡ ¼³Ä¡µÇ¾î ÀÖ´Â ¾î¶² °æ·Î¸íÀÌ¶óµµ ÁÁ½À´Ï´Ù.

ÆÄÀ̽ã ÀÎÅÍÇÁ¸®ÅÍ°¡ ÀÖ´Â °÷¿¡ »ó°ü ¾øÀÌ ±× ½ºÅ©¸³Æ®¸¦ ½ÇÇàÇÏ°í ½Í´Ù¸é, "env" ÇÁ·Î±×·¥À» »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. °ÅÀÇ ¸ðµç Ç÷§Æû¿¡¼­ ´ÙÀ½Àº Àß ÀÛµ¿ÇÒ °ÍÀÔ´Ï´Ù, ÆÄÀ̽ã ÀÎÅÍÇÁ¸®ÅÍ°¡ »ç¿ëÀÚÀÇ $PATH°¡ ÁöÁ¤ÇÏ´Â µð·ºÅ丮¿¡ ÀÖ´Ù´Â °¡Á¤ÇÑ´Ù¸é:

#! /usr/bin/env python
ÁÖÀÇ -- CGI ½ºÅ©¸³Æ®¿¡ ´ëÇؼ­´Â ÀÌ·¸°Ô *ÇÏÁö ¸¶¼¼¿ä*. CGI ½ºÅ©¸³Æ®¿¡ ´ëÇÑ $PATH º¯¼ö´Â ¾ÆÁÖ ÀÛ½À´Ï´Ù, ±×·¡¼­ ÆÄÀ̽ã ÀÎÅÍÇÁ¸®ÅÍÀÇ ½ÇÁ¦ÀûÀÎ Àý´ë °æ·Î¸íÀ» »ç¿ëÇÒ ÇÊ¿ä°¡ ÀÖ½À´Ï´Ù.

¶§¶§·Î, »ç¿ëÀÚÀÇ È¯°æÀº ²Ë Â÷¼­ /usr/bin/env ÇÁ·Î±×·¥ÀÌ ½ÇÆÐÇÕ´Ï´Ù; ¶Ç´Â ÀüÇô env ÇÁ·Î±×·¥ÀÌ ¾øÀ» ¼öµµ ÀÖ½À´Ï´Ù. ±×·¯ÇÑ °æ¿ì¿¡´Â, ´ÙÀ½ÀÇ (¾Ë·º½º ·¹Áø½ºÅ°(Alex Rezinsky)ÀÇ ¹è·Á¿¡ ÀÇÇÑ) Àӽà º¯ÅëÀ» »ç¿ëÇØ º¼ ¼ö ÀÖ½À´Ï´Ù:

  #! /bin/sh
  """:"
  exec python $0 ${1+"$@"}
  """
´ÜÁ¡À̶ó¸é ÀÌ°ÍÀÌ ±× ½ºÅ©¸³Æ®ÀÇ __doc__ ¹®ÀÚ¿­ÀÌ µÇ¾î¹ö¸°´Ù´Â °ÍÀε¥, ±×·¸Áö¸¸ ´ÙÀ½°ú °°ÀÌ µ¡ ºÙ¿©¼­ ±×°ÍÀ» ÇØ°áÇÒ ¼ö ÀÖ½À´Ï´Ù.

  __doc__ = """...Whatever..."""


4.64. ¾î¶»°Ô ¸®½ºÆ®·ÎºÎÅÍ Áߺ¹À» Á¦°ÅÇϳª¿ä?

ÀϹÝÀûÀ¸·Î, ±× ¸®½ºÆ®¸¦ ÀçÁ¤·ÄÇϴµ¥ °³ÀÇÄ¡ ¾Ê´Â´Ù¸é

   if List:
      List.sort()
      last = List[-1]
      for i in range(len(List)-2, -1, -1):
          if last==List[i]: del List[i]
          else: last=List[i]
¸¸¾à ±× ¸®½ºÆ®ÀÇ ¸ðµç ¿ä¼ÒµéÀÌ »çÀüÀÇ Å°·Î »ç¿ëµÈ´Ù¸é (Áï, ¸ðµÎ Çؽ¬°è»êÀÌ °¡´ÉÇÏ´Ù¸é) ÀÌ°ÍÀº ¾î¶² ¶§´Â ´õ ºü¸¨´Ï´Ù.

   d = {}
   for x in List: d[x]=x
   List = d.values()
¶ÇÇÑ, ±²ÀåÈ÷ °Å´ëÇÑ ¸®½ºÆ®¿¡ ´ëÇؼ­ ´õ ÃÖÀûÀÇ ´ë¾ÈÀº ù ¹ø° ¹æ¹ýÀ̶ó°í »ý°¢ÇÒ °ÍÀÔ´Ï´Ù. µÎ ¹ø° ´ë¾ÈÀº »ç¿ëµÉ ¼ö ÀÖÀ» ¶§¸¶´Ù ¾ÆÁÖ ÈǸ¢ÇÕ´Ï´Ù.


4.65. ÆÄÀ̽㿡¼­ ¾Ë·ÁÁø 2000³â ¹®Á¦°¡ ÀÖ³ª¿ä?

ÆÄÀ̽ã 1.5¿¡¼­ 2000³â °áÇÔÀÌ ÀÖ´Ù´Â °ÍÀº °¨ÁöÇÏÁö ¸øÇß½À´Ï´Ù. ÆÄÀ̽ãÀº °ÅÀÇ ³¯Â¥ °è»êÀ» ÇÏÁö ¾Ê½À´Ï´Ù ±×¸®°í ÇÊ¿ä°¡ ÀÖ´Ù¸é, C ¶óÀ̺귯¸® ÇÔ¼ö¿¡ ÀÇÁ¸ÇÕ´Ï´Ù. ÆÄÀ̽ãÀº ÀϹÝÀûÀ¸·Î ½Ã°£À» 1970³â ÀÌÈÄÀÇ ÃÊ´ÜÀ§·Î ³ªÅ¸³»´ø°¡ ȤÀº ÅÍÇ÷Π(year, month, day, ...) ³ªÅ¸³»´Âµ¥, year´Â ³× °³ÀÇ ÀÚ¸®¼ö·Î Ç¥ÇöµÇ¹Ç·Î, Y2K ¹ö±×¸¦ ¸¸µé °Í °°Áö´Â ¾Ê¾Æ º¸ÀÔ´Ï´Ù. ±×·¡¼­ C ¶óÀ̺귯¸®°¡ ÀÌ»ó¾ø´ÂÇÑ, ÆÄÀ̽㠿ª½Ã ÀÌ»ó¾ø½À´Ï´Ù. ¹°·Ð, ³ª´Â ¿©·¯ºÐÀÇ ÆÄÀ̽ã Äڵ带 º¸ÁõÇÒ ¼ö´Â ¾ø½À´Ï´Ù!

ÀÚÀ¯·Ó°Ô ¾òÀ» ¼ö ÀÖ´Â ¼ÒÇÁÆ®¿þ¾îÀÇ º»¼º»ó, ³ª´Â ÀÌ Áø¼úÀÌ ¹ýÀûÀ¸·Î ±¸¼Ó·ÂÀÌ ¾ø´Ù´Â °ÍÀ» Ãß°¡ ÇØ¾ß ÇÒ ÇÊ¿ä°¡ ÀÖ½À´Ï´Ù. ÆÄÀ̽ãÀÇ º¹»ç±Ç °íÁö»çÇ׿¡´Â ´ÙÀ½ÀÇ ±Ç¸®ºÎÀÎÀÌ ÀÖ½À´Ï´Ù:

  STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH    
  REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF           
  MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH   
  CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL     
  DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR    
  PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER          
  TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR          
  PERFORMANCE OF THIS SOFTWARE.                                            

  ¾î¶°ÇÑ Æ¯º°ÇÑ, °£Á¢Àû ȤÀº»ó´çÇÑ ÇÇÇØ¿¡ ´ëÇؼ­µµ, 
  ȤÀº µ¥ÀÌŸ, ÀÌÀÍÀÇ ¸Á½Ç,»ç¿ëºÒ´ÉÀ¸·Î ÀÎÇÑ ¾î¶² ÇÇÇØ¿¡ ´ëÇؼ­µµ,
  ¼ÒÇÁÆ®¿þ¾îÀÇ ¼öÇà ȤÀº »ç¿ë°ú °ü·ÃÇÑ È¤Àº ¾ß±âµÈ,
  ¼ÒȦÇàÀ§, °è¾àÇàÀ§ ȤÀº ´Ù¸¥ °­Á¦ ÇàÀ§µî
  »ó¾÷ÀûÀÌ¿ë°ú ÃÖÀûÈ­¿¡ ´ëÇÑ ¸ðµç ¹¬½ÃÀû º¸ÁõÀ»Æ÷ÇÔÇÏ¿©, 
  ¾î¶² °æ¿ì¶óµµ CNRI´Â ÀÌ ¼ÒÇÁÆ®¿þ¾î¿¡ ´ëÇÑ ¸ðµç º¸ÁõÀ» ºÎÀÎÇÑ´Ù
ÁÁÀº ¼Ò½ÄÀº ¸¸¾à ¿©·¯ºÐÀÌ ¹®Á¦¿¡ ºÀÂøÇϸé, Àüü ¼Ò½º¸¦ ¾òÀ» ¼ö À־ ±×°ÍÀ» ÃßÀûÇÏ¿© ¹®Á¦¸¦ ¼öÁ¤ÇÒ ¼ö ÀÖ´Ù´Â °ÍÀÔ´Ï´Ù!


4.66. ÀÏ·ÃÀÇ °´Ã¼µé¿¡ ¸Þ½îµå¸¦ Àû¿ëÇÏ´Â map ¹öÀüÀ» ¿øÇÕ´Ï´Ù! µµ¿Í ÁÖ¼¼¿ä!

»ó»óÇØ º¸¼¼¿ä!

  def method_map(objects, method, arguments):
       """method_map([a,b], "flog", (1,2)) gives [a.flog(1,2), b.flog(1,2)]"""
       nobjects = len(objects)
       methods = map(getattr, objects, [method]*nobjects)
       return map(apply, methods, [arguments]*nobjects)
map, apply, getattr ±×¸®°í ÆÄÀ̽ãÀÇ ´Ù¸¥ µ¿Àû »ç¾çµéÀÇ ½Åºñ¸¦ ÀÌÇØÇÏ´Â °ÍÀº ÀϹÝÀûÀ¸·Î ÁÁÀº »ý°¢ÀÔ´Ï´Ù.


4.67. ÆÄÀ̽㿡¼­ ¾î¶»°Ô ¹«ÀÛÀ§ ¼ö¸¦ »ý¼ºÇϳª¿ä?**

Ç¥ÁØ ¶óÀ̺귯¸® ¸ðµâ "random"Àº ¹«ÀÛÀ§ ¼ö »ý¼º±â¸¦ ±¸ÇöÇÏ°í ÀÖ½À´Ï´Ù. »ç¿ë¹ýÀº °£´ÜÇÕ´Ï´Ù:

    import random
    random.random()
ÀÌ°ÍÀº [0, 1) ¹üÀ§ÀÇ ¹«ÀÛÀ§ÀûÀÎ ºÎµ¿¼Ò¼öÁ¡ ¼ö¸¦ ¹ÝȯÇÕ´Ï´Ù.

ÀÌ ¸ðµâ¿¡´Â ´Ù¸¥ Ưº°ÇÑ »ý¼ºÀÚ(generator)µµ ÀÖ½À´Ï´Ù:

    randrange(a, b)´Â [a, b) ¹üÀ§ÀÇ Á¤¼ö¸¦ ¼±ÅÃÇÕ´Ï´Ù.
    choice(S)´Â ÁÖ¾îÁø ¿¬¼Ó¿­¿¡¼­ ¼±ÅÃÇÕ´Ï´Ù.
    uniform(a, b)´Â [a, b) ¹üÀ§ÀÇ ºÎµ¿¼Ò¼öÁ¡ ¼ö¸¦ ¼±ÅÃÇÕ´Ï´Ù.
¹«ÀÛÀ§ ¼ö »ý¼º±âÀÇ ÃʱâÈ­ ¼³Á¤À» °­Á¦ÇÏ·Á¸é, ´ÙÀ½À» »ç¿ëÇϼ¼¿ä.

    seed(x, y, z)´Â [1, 256) »çÀÌÀÇ ¼¼ °³ÀÇ Á¤¼ö·ÎºÎÅÍ ¾¾ °ªÀ» ¼³Á¤ÇÕ´Ï´Ù. 
RandomÀ̶ó´Â, Ŭ·¡½ºµµ Àִµ¥ ±×°ÍÀ» ÃʱâÈ­ÇÏ¿© µ¶¸³ÀûÀÎ ´ÙÁß ¹«ÀÛÀ§ ¼ö »ý¼º±â¸¦ ¸¸µé ¼ö ÀÖ½À´Ï´Ù.

±× ¸ðµâÀº ¶ÇÇÑ ´Ù¾çÇÑ Ç¥ÁØ ¹èÆ÷º»¿¡ ÁØÇÏ´Â ÇÔ¼öµéÀ» ´ã°í ÀÖ½À´Ï´Ù.

ÀÌ ¸ðµç °ÍÀº ¶óÀ̺귯¸® ÂüÁ¶ ¸Å´º¾ó¿¡ ¹®¼­È­ µÇ¾î ÀÖ½À´Ï´Ù. ¸ðµâ "whrandom"Àº Æó±âµÇ¾ú´Ù´Â °ÍÀ» ÁÖÀÇÇϼ¼¿ä.


4.68. ¾î¶»°Ô Á÷·Ä (RS232) Æ÷Æ®¿¡ Á¢±ÙÇϳª¿ä?

À©µµ¿ì¿¡ (RS 232 Á÷·Ä Æ÷Æ®¸¦ ÅëÇÑ Åë½ÅÀ» À§ÇÑ) Á÷·Ä Åë½Å ¸ðµâÀÌ ÀÖ½À´Ï´Ù. ´ÙÀ½ ÂüÁ¶:

  ftp://ftp.python.org/pub/python/contrib/sio-151.zip
  http://www.python.org/ftp/python/contrib/sio-151.zip
µµ½º¸¦ À§Çؼ­´Â, Çѽº ³ë¹ÚÀÇ Python-DX¸¦ ½ÃÇèÇØ º¸¼¼¿ä, ÀÌ°ÍÀ» Áö¿øÇÕ´Ï´Ù, ´ÙÀ½ ÂüÁ¶:

  http://www.cuci.nl/~hnowak/
À¯´Ð½º¸¦ À§Çؼ­´Â, (http://www.python.org/search/¸¦ »ç¿ëÇÏ¿©) µ¥ÀÚ ´º½º¸¦ Ž»öÇϼż­ ÀúÀÚ°¡ ¹ÌÄ¡ äÇÁ¸¸(Mitch Chapman)ÀÎ "serial port"¸¦ ã¾Æ º¸¼¼¿ä (±×ÀÇ ±ÛÀ» ¿©±â¿¡ Æ÷ÇÔ½ÃÅ°±â¿¡´Â ¾à°£ ±æ±º¿ä).


4.69. Tk-Buttons¿¡ °üÇÑ À̹ÌÁö°¡ Py15¿¡¼­ ÀÛµ¿ÇÏÁö ¾Ê½À´Ï´Ù?

ºÐ¸íÈ÷ ÀÛµ¿ÇÕ´Ï´Ù, ±×·¯³ª ¸ÕÀú ±× À̹ÌÁö °´Ã¼¿¡ ´ëÇÑ ÀڽŸ¸ÀÇ ÂüÁ¶Á¡À» À¯ÁöÇØ¾ß ÇÕ´Ï´Ù. ´õ ÀÚ¼¼È÷ ¼³¸íÇϸé, È®ÀÎÇØ¾ß ÇÒ °ÍÀº, ¿¹¸¦ µé¾î, Àü¿ª º¯¼ö ȤÀº Ŭ·¡½º ¼Ó¼ºÀÌ ±× °´Ã¼¸¦ ÂüÁ¶ÇÏ°í ÀÖ´ÂÁö¸¦ È®ÀÎÇØ¾ß ÇÕ´Ï´Ù.

¸ÞÀϸµ ¸®½ºÆ®·ÎºÎÅÍ ÇÁ·¹µå¸¯ ·éÆ®(Fredrik Lundh)¸¦ ÀοëÇÔ:

  ¸ÕÀú, Tk ¹öÆ° À§Á¬Àº ³»ºÎÀÇ photoimage °´Ã¼¿¡ ´ëÇÑ ÂüÁ¶Á¡À» À¯ÁöÇÏ°í ÀÖÁö¸¸, 
  Tkinter´Â ±×·¸Áö ¾Ê½À´Ï´Ù.  ±×·¡¼­ ÆÄÀ̽ãÀÇ ¸¶Áö¸· ÂüÁ¶Á¡ÀÌ »ç¶óÁö¸é, 
  Tkinter´Â Tk¿¡°Ô photoimage¸¦ ÇØÁ¦Çϵµ·Ï ¸í·ÉÇÕ´Ï´Ù.  ±×·¯³ª ±× À̹ÌÁö´Â À§Á¬ÀÌ
  »ç¿ëÇÏ°í ÀÖÀ¸¹Ç·Î, Tk´Â ±×°ÍÀ» Æı«ÇÏÁö ¾Ê½À´Ï´Ù. ¿ÏÀüÇÏ°Ô´Â ¾Æ´Õ´Ï´Ù.  
  ±× À̹ÌÁö¸¦ °ø¹éÈ­ ÇÏ¿©¼­, ¿ÏÀüÈ÷ Åõ¸íÇÏ°Ô ¸¸µé¾î ¹ö¸®´Âµ¥...
  ³× ±×·¸½À´Ï´Ù, 1.4¿¡¼­ ó¸®ÇÏ´Â Å°¿öµå Àμö¿¡´Â, ¾î¶² °æ¿ì¿¡ ¿©ºÐÀÇ ÂüÁ¶Á¡À» 
  À¯ÁöÇÏ´Â ¹ö±×°¡ ÀÖ¾ú½À´Ï´Ù. ±×¸®°í ±Íµµ°¡ ±× ¹ö±×¸¦ 1.5¿¡¼­ °íÃÆÀ» ¶§´Â,
  »ó´ç·®ÀÇ Tkinter ÇÁ·Î±×·¥µéÀ» ¸Á°¡ ¶ß·È½À´Ï´Ù....


4.70. math.py (socket.py, regex.py, µîµî.) ¼Ò½º ÆÄÀÏÀº ¾îµð¿¡ ÀÖ³ª¿ä?

¸ðµâ¿¡ ´ëÇÑ ¼Ò½º ÆÄÀÏÀ» ãÀ» ¼ö ¾ø´Ù¸é ±×°ÍÀº C, C++ ȤÀº ´Ù¸¥ ÄÄÆÄÀÏ ¾ð¾î·Î ±¸ÇöµÈ ³»Àå ȤÀº µ¿ÀûÀ¸·Î ÀûÀçµÈ ¸ðµâÀÏ ¼ö ÀÖ½À´Ï´Ù. ÀÌ °æ¿ì¿¡ ¼Ò½º ÆÄÀÏÀ» °¡Áú ¼ö ¾ø°Å³ª ȤÀº (ÆÄÀ̽㠰æ·Î°¡ ¾Æ´Ñ) C ¼Ò½º µð·ºÅ丮ÀÇ ¾îµð¿£°¡¿¡ ÀÖ´Â, mathmodule.c¿Í °°Àº ¾î¶² °ÍÀÏ ¼ö ÀÖ½À´Ï´Ù.

ÇÁ·¹µå¸¯ ·éÆ®(Fredrik Lundh) (fredrik@pythonware.com)°¡ ¼³¸íÇÑ ¹Ù¿¡ ÀÇÇϸé (ÆÄÀ̽ã-¸®½ºÆ®¿¡¼­):

(Àû¾îµµ) ¼¼ °¡Áö Á¾·ùÀÇ ¸ðµÑÀÌ ÆÄÀ̽㿡 ÀÖ½À´Ï´Ù: 1) ÆÄÀ̽ãÀ¸·Î ÀÛ¼ºµÈ ¸ðµâ (.py); 2) C·Î ÀÛ¼ºµÇ°í µ¿ÀûÀ¸·Î ÀûÀçµÇ´Â ¸ðµâ (.dll, .pyd, .so, .sl, µîµî); 3) C·Î ÀÛ¼ºµÇ°í ÀÎÅÍÇÁ¸®ÅÍ¿Í ¿¬°áµÈ ¸ðµâ; ÀÌ·¯ÇÑ °ÍµéÀÇ ¸®½ºÆ®¸¦ ¾òÀ¸·Á¸é, ´ÙÀ½°ú °°ÀÌ Å¸ÀÚÇϼ¼¿ä:

    import sys
    print sys.builtin_module_names


4.71. ÆÄÀ̽㠽ºÅ©¸³Æ®·ÎºÎÅÍ ¾î¶»°Ô ¸ÞÀÏÀ» º¸³»³ª¿ä?

À¯´Ð½º¿¡¼­´Â, sendmailÀ» »ç¿ëÇϸé, ´ë´ÜÈ÷ ¿ëÀÌÇÕ´Ï´Ù. sendmail ÇÁ·Î±×·¥ÀÇ À§Ä¡´Â ½Ã½ºÅÛ¿¡ µû¶ó ´Ù¸¨´Ï´Ù; ¾î¶² ¶§´Â /usr/lib/sendmail¿¡ ÀÖ°í, ¾î¶² ¶§´Â /usr/sbin/sendmail¿¡ ÀÖ½À´Ï´Ù. sendmail ¸Å´º¾ó ÆäÀÌÁö¸¦ º¸½Ã¸é µµ¿òÀÌ µÉ °ÍÀÔ´Ï´Ù. ¿©±â¿¡ ¾à°£ÀÇ ¿¹Á¦ Äڵ尡 ÀÖ½À´Ï´Ù:

  SENDMAIL = "/usr/sbin/sendmail" # sendmail location
  import os
  p = os.popen("%s -t" % SENDMAIL, "w")
  p.write("To: cary@ratatosk.org\n")
  p.write("Subject: test\n")
  p.write("\n") # blank line separating headers from body
  p.write("Some text\n")
  p.write("some more text\n")
  sts = p.close()
  if sts != 0:
      print "Sendmail exit status", sts
ºñ-À¯´Ð½º ½Ã½ºÅÛ¿¡¼­´Â (±×¸®°í ¹°·Î, À¯´Ð½º ½Ã½ºÅÛ¿¡¼­µµ!), SMTP¸¦ »ç¿ëÇÏ¿© ¸ÞÀÏÀ» ÀÌ¿ôÀÇ ¸ÞÀÏ ¼­¹ö¿¡ º¸³¾ ¼ö ÀÖ½À´Ï´Ù. ÆÄÀ̽ã 1.5.1 ÀÌÈÄ·Î SMTP¸¦ À§ÇÑ ¶óÀ̺귯¸® smtplib.py°¡ Æ÷ÇԵǾú½À´Ï´Ù. ¿©±â¿¡ ´ë´ÜÇÑ °£´ÜÇÑ »óÈ£´ëÈ­Àû ¸ÞÀÏ ¼Û½ÅÀÚ°¡ ±×°ÍÀ» »ç¿ëÇÏ°í ÀÖ½À´Ï´Ù. ÀÌ ¹æ¹ýÀº SMTP ¼ö½ÅÀÚ¸¦ Áö¿øÇÏ´Â ¾î¶°ÇÑ È£½ºÆ®¿¡ ´ëÇؼ­µµ Àß ÀÛµ¿ÇÒ °ÍÀÔ´Ï´Ù; ±×·¸Áö ¾ÊÀ¸¸é, »ç¿ëÀÚ¿¡°Ô È£½ºÆ®¸¦ ¿ä±¸ÇØ¾ß ÇÒ °ÍÀÔ´Ï´Ù:

    import sys, smtplib
    fromaddr = raw_input("From: ")
    toaddrs  = string.splitfields(raw_input("To: "), ',')
    print "Enter message, end with ^D:"
    msg = ''
    while 1:
        line = sys.stdin.readline()
        if not line:
            break
        msg = msg + line
    # The actual mail send
    server = smtplib.SMTP('localhost')
    server.sendmail(fromaddr, toaddrs, msg)
    server.quit()


4.72. ¼ÒÄÏ¿¡ ´ëÇÑ connect()¿¡¼­ ºí·ÎÅ·À» ¾î¶»°Ô ÇÇÇϳª¿ä?

select ¸ðµâÀº ÀÏ´Ü ¿¬°áµÇ¸é ¼ÒÄÏ¿¡ ´ëÇÑ ºñµ¿±â ÀÔÃâ·Â(I/O)¿¡ µµ¿òÀÌ µÇ´Â °ÍÀ¸·Î Àß ¾Ë·ÁÁ® ÀÖ½À´Ï´Ù. ±×·¸Áö¸¸, ÃʱâÀÇ connect() È£Ãâ¿¡¼­ ºí·ÎÅ·À» ÇÇÇÏ´Â ¹ýÀº Àß ¾Ë·ÁÁ® ÀÖÁö ¾Ê½À´Ï´Ù. Á¦·¹¹Ì ÈúÆ°(Jeremy Hylton)Àº ´ÙÀ½ÀÇ Ãæ°í¸¦ ÇÕ´Ï´Ù (¾à°£ ¼öÁ¤µÊ):

TCP ¿¬°áÀÌ ºí·ÎÅ· µÇ´Â °ÍÀ» ¹æÁöÇÏ·Á¸é, ±× ¼ÒÄÏÀ» ºñ-ºí·ÎÅ·(non-blocking) ¸ðµå·Î ¼³Á¤ÇÒ ¼ö ÀÖ½À´Ï´Ù. ±×¸®°í ³ª¼­ connect()¸¦ ½ÇÇàÇϸé, (±×·²°Í °°Áö´Â ¾Ê°ÚÁö¸¸) Áï°¢ ¿¬°áµÇ°Å³ª ȤÀº ¿¡·¯¹øÈ£(errno)¸¦ ´ãÀº ¿¹¿Ü¸¦ ¾ò½À´Ï´Ù. errno.EINPROGRESS´Â ¿¬°áÀÌ ÁøÇàÁßÀÌÁö¸¸, ¾ÆÁ÷ ¿Ï·áµÇÁö ¾Ê¾Ò´Ù´Â °ÍÀ» ³ªÅ¸³À´Ï´Ù. ´Ù¸¥ ¿î¿µÃ¼Á¦¿¡¼­´Â ´Ù¸¥ errnos¸¦ ¹ÝȯÇÕ´Ï´Ù, ±×·¡¼­ ¿©·¯ºÐÀº Á¡°ËÇغ¼ ÇÊ¿ä°¡ ÀÖ½À´Ï´Ù. È®½ÇÇÏ°Ô ¸»ÇØ ÁÙ ¼ö ÀÖ´Â °ÍÀº ´Ù¸¥ ¹öÀüÀÇ ¼Ö¶ó¸®½º´Â ¼­·Î ´Ù¸¥ errno °ªÀ» ¹ÝȯÇÑ´Ù´Â °ÍÀÔ´Ï´Ù.

ÆÄÀ̽ã 1.5 À̻󿡼­´Â, connect_ex()¸¦ »ç¿ëÇÏ¿© ¿¹¿Ü¸¦ »ý¼ºÇÏ´Â °ÍÀ» ÇÇÇÒ ¼ö ÀÖ½À´Ï´Ù. ±×°ÍÀº ´ÜÁö errno °ª¸¸À» ¹ÝȯÇÒ °ÍÀÔ´Ï´Ù.

ŽÁö(poll)¸¦ ÇÏ·Á¸é, connect_ex()¸¦ ³ªÁß¿¡ ¶Ç ´Ù½Ã È£ÃâÇÒ ¼ö ÀÖ½À´Ï´Ù -- 0 ¶Ç´Â errno.EISCONN´Â ¿¬°áµÇ¾î ÀÖ´Ù´Â °ÍÀ» ³ªÅ¸³À´Ï´Ù -- ¶Ç´Â ÀÌ ¼ÒÄÏÀ» ¼¿·ºÆ®(select)¿¡ °Ç³×ÁÖ¾î (±×°ÍÀÌ ¾²±â °¡´ÉÇÑ°¡¸¦ Á¡°ËÇÒ ¼ö ÀÖ½À´Ï´Ù).


4.73. ¾î¶»°Ô 16Áø¼ö¿Í 8Áø Á¤¼ö¸¦ ÁöÁ¤Çϳª¿ä?

8Áø ÀÚ¸®¸¦ ÁöÁ¤Çϱâ À§Çؼ­´Â, ±× 8Áø °ªÀÇ ¾ÕÂÊ¿¡ 0(Á¦·Î)¸¦ µÎ¼¼¿ä. ¿¹¸¦ µé¾î, º¯¼ö "a"¿¡ 8Áø °ª "10"( 10Áø¼ö·Î´Â 8)À» ¼³Á¤ÇÏ·Á¸é, ´ÙÀ½°ú °°ÀÌ Å¸ÀÚÇϼ¼¿ä:

    >>> a = 010
ÀÌ°ÍÀÌ ÀÛµ¿ÇÏ´ÂÁö È®ÀÎÇÏ·Á¸é, ÀÎÅÍÇÁ¸®ÅÍ¿¡¼­ "a"¸¦ ŸÀÚÇÏ°í ¿£Å͸¦ Ä¡¸é, ÆÄÀ̽ãÀÌ "a"ÀÇ ÇöÀç °ªÀ» 10Áø¼ö·Î ÅäÇØ ³¾ °ÍÀÔ´Ï´Ù:

    >>> a
    8
16Áø¼öµµ ¸¶Âù°¡Áö·Î ½±½À´Ï´Ù. °£´ÜÇÏ°Ô ±× 16Áø¼öÀÇ ¾Õ¿¡ 0(Á¦·Î)¸¦ µÎ°í, ´ÙÀ½¿¡ ¼Ò¹®ÀÚ "x"¸¦ µÎ¼¼¿ä. 16Áø ¼ýÀÚ´Â ¼Ò¹®ÀÚ È¤Àº ´ë¹®ÀÚ·Î ÁöÁ¤µÉ ¼ö ÀÖ½À´Ï´Ù. ¿¹¸¦ µé¾î, ÆÄÀ̽ã ÀÎÅÍÇÁ¸®ÅÍ¿¡¼­´Â:

    >>> a = 0xa5
    >>> a
    165
    >>> b = 0XB2
    >>> b
    178


4.74. ÇÑ ¹ø¿¡ ÇÑ °³ÀÇ Å°´­¸²À» ȹµæÇÏ´Â ¹ý?

À©µµ¿ì¿¡ ´ëÇؼ­´Â, Áú¹® 8.2¸¦ ÂüÁ¶Çϼ¼¿ä. ¿©±â¿¡ À¯´Ð½º¸¦ À§ÇÑ ´äº¯ÀÌ ÀÖ½À´Ï´Ù.

´Ù¼öÀÇ ÇØ°áÃ¥ÀÌ ÀÖ½À´Ï´Ù; ¾î¶² °ÍÀº curses¸¦ »ç¿ëÇÏ´Â °Í°ú °ü·ÃµÇ´Âµ¥, ±×°ÍÀº ¹è¿ì±â¿¡ ´ë´ÜÈ÷ Å®´Ï´Ù. ¿©±â¿¡ ¾Øµå·ù ÄíŬ¸µ(Andrew Kuchling)ÀÇ ¹è·Á¿¡ ÀÇÇÑ, curses¸¦ »ç¿ëÇÏÁö ¾Ê´Â ÇØ°áÃ¥ÀÌ ÀÖ½À´Ï´Ù (PGP-½ºÅ¸ÀÏÀÇ ¹«ÀÛÀ§¼ö ¹Ù±¸´Ï ¸¸µé±â ÄÚµå·ÎºÎÅÍ ÀοëÇÔ):

        import termios, TERMIOS, sys, os
        fd = sys.stdin.fileno()
        old = termios.tcgetattr(fd)
        new = termios.tcgetattr(fd)
        new[3] = new[3] & ~TERMIOS.ICANON & ~TERMIOS.ECHO
        new[6][TERMIOS.VMIN] = 1
        new[6][TERMIOS.VTIME] = 0
        termios.tcsetattr(fd, TERMIOS.TCSANOW, new)
        s = ''    # We'll save the characters typed and add them to the pool.
        try:
            while 1:
                c = os.read(fd, 1)
                print "Got character", `c`
                s = s+c
        finally:
            termios.tcsetattr(fd, TERMIOS.TCSAFLUSH, old)
ÀÌ°ÍÀÌ ÀÛµ¿ÇÏ·Á¸é termios ¸ðµâÀÌ ÇÊ¿äÇÕ´Ï´Ù, ±×¸®°í ¸®´ª½º¿¡¼­¸¸ ½ÃµµÇØ º¸¾ÒÀ» »ÓÀÌÁö¸¸, ´Ù¸¥ °÷¿¡¼­µµ ÀÛµ¿ÇÒ °ÍÀÔ´Ï´Ù. ±×°ÍÀº stdinÀÇ ¹ÝÇâÀ» ²ô°í ±âÁØ(canonical) ¸ðµå¸¦ »ç¿ëºÒ°¡·Î ÇÏ°í, ±×¸®°í ³ª¼­ ÇÑ ¹ø¿¡ ÇÑ ±ÛÀÚ¾¿ Ç¥ÁØÀÔ·ÂÀ¸·ÎºÎÅÍ ÀоîµéÀ̸ç, °¢ Å°´­¸² ÀÌÈÄ¿¡´Â ¾Æ¹«°Íµµ ÀÐ¾î µéÀÌÁö ¾Ê½À´Ï´Ù.


4.75. ÆÄÀ̽㿡¼­ ¾î¶»°Ô ±¸¼ºÀÚ (ȤÀº ¸Þ½îµå)¸¦ µ¤¾î ¾µ ¼ö ÀÖ³ª¿ä?

(ÀÌ°ÍÀº ½ÇÁ¦·Î ¸ðµç ¸Þ½îµé¿¡ Àû¿ëµË´Ï´Ù, ±×·¯³ª À¢ÀÏÀÎÁö ±× Áú¹®Àº º¸Åë ±¸¼ºÀÚÀÇ ¹®¸Æ¿¡¼­ ¸ÕÀú ³ªÅ¸³³´Ï´Ù.)

C++À¸·Î´Â ´ÙÀ½°ú °°ÀÌ ÀÛ¼ºÇÏ´Â °÷¿¡¼­

    class C {
        C() { cout << "No arguments\n"; }
        C(int i) { cout << "Argument is " << i << "\n"; }
    }
ÆÄÀ̽㿡¼­´Â ±âº» ÀμöµéÀ» »ç¿ëÇÏ¿©, ¸ðµç °æ¿ìµéÀ» ³ªÆ÷ÇÏ´Â ÇÑ °³ÀÇ ±¸¼ºÀÚ¸¦ ÀÛ¼ºÇÏ¿©¾ß ÇÕ´Ï´Ù, ¿¹¸¦ µé¾î:

    class C:
        def __init__(self, i=None):
            if i is None:
                print "No arguments"
            else:
                print "Argument is", i
ÀÌ°ÍÀº ÀüÀûÀ¸·Î µ¿µîÇÑ °ÍÀº ¾Æ´ÏÁö¸¸, ½Ç¿ëÀûÀ¸·Î´Â ÃæºÐÈ÷ ±ÙÁ¢ÇÕ´Ï´Ù.

°¡º¯-±æÀÌ Àμö ¸®½ºÆ®¸¦ ½ÃÇèÇØ º¼ ¼öµµ ÀÖ½À´Ï´Ù, ¿¹¸¦ µé¾î.

        def __init__(self, *args):
            ....
°°Àº Á¢±Ù¹ýÀÌ ¸ðµç ¸Þ½îµå Á¤ÀÇ¿¡ ´ëÇÏ¿© ÀÛµ¿ÇÕ´Ï´Ù.


4.76. ¾î¶»°Ô Å°¿öµå Àμö¸¦ ÇϳªÀÇ ¸Þ½îµå¿¡¼­ ´Ù¸¥ ¸Þ½îµå·Î °Ç³×³ª¿ä?

apply¸¦ »ç¿ëÇϼ¼¿ä. ¿¹¸¦ µé¾î:

    class Account:
        def __init__(self, **kw):
            self.accountType = kw.get('accountType')
            self.balance = kw.get('balance')
    class CheckingAccount(Account):
        def __init__(self, **kw):
            kw['accountType'] = 'checking'
            apply(Account.__init__, (self,), kw)
    myAccount = CheckingAccount(balance=100.00)
ÆÄÀ̽ã 2.0¿¡¼­´Â ±×°ÍÀ» »õ·Î¿î ** ±¸¹®À» »ç¿ëÇÏ¿© Á÷Á¢ È£ÃâÇÒ ¼ö ÀÖ½À´Ï´Ù:

    class CheckingAccount(Account):
        def __init__(self, **kw):
            kw['accountType'] = 'checking'
            Account.__init__(self, **kw)
ȤÀº ´õ¿í ÀϹÝÀûÀ¸·Î:

 >>> def f(x, *y, **z):
 ...  print x,y,z
 ...
 >>> Y = [1,2,3]
 >>> Z = {'foo':3,'bar':None}
 >>> f('hello', *Y, **Z)
 hello (1, 2, 3) {'foo': 3, 'bar': None}


4.77. HTMLÀ» ¸¸µé±â À§ÇØ µµ¿òÀ» ¹ÞÀ¸·Á¸é ¾î¶² ¸ðµâÀ» »ç¿ëÇØ¾ß Çϳª¿ä?

·Îºó ÇÁ¸®µå¸®È÷(Robin Friedrich)°¡ ÀÛ¼ºÇÑ HTMLgenÀ» Á¡°ËÇϼ¼¿ä. ±×°ÍÀº ¸ðµç HTML 3.2 ¸¶Å©¾÷ ű׿¡ »óÀÀÇÏ´Â °´Ã¼µéÀ» °¡Áø Ŭ·¡½º ¶óÀ̺귯¸®ÀÔ´Ï´Ù. ÆÄÀ̽ãÀ¸·Î ÀÛ¼ºÇÏ°í ÀÖÀ» ¶§ ±×¸®°í À¥ ÆäÀÌÁö¸¦ ¸¸µé°Å³ª ȤÀº CGI Æû µîµîÀ» ¸¸µé±â À§ÇØ HTML ÆäÀÌÁö¸¦ ÇÕ¼ºÇϱ⸦ ¿øÇÒ ¶§¿¡ »ç¿ëµË´Ï´Ù.

±×°ÍÀº python.org ¶Ç´Â Starship¿¡ ÀÖ´Â FTP °øÇå Áö¿ª¿¡¼­ ãÀ» ¼ö ÀÖ½À´Ï´Ù. Ž»ö ¿£ÁøÀ» »ç¿ëÇÏ¿© ÃֽŠ¹öÀüÀ» ã¾Æ º¸¼¼¿ä.

¶ÇÇÑ ÆÄÀ̽ã ÄÚµå¿Í HTML ÄÚµå »çÀ̸¦ ¸íÈ®ÇÏ°Ô °¥¶óÁÖ´Â, ¹®¼­ÀӽÿøÇü(DocumentTemplate)À» °í·ÁÇÏ´Â µ¥¿¡ À¯¿ëÇÒÁöµµ ¸ð¸¨´Ï´Ù. Àӽù®¼­¿øÇü(DocumentTemplate)Àº Bobo °´Ã¼ ÃâÆÇ ½Ã½ºÅÛÀÇ (http:/www.digicool.com/releases) ÀϺÎÀÌÁö¸¸ ¹°·Ð µ¶¸³ÀûÀ¸·Î »ç¿ëµÉ ¼ö ÀÖ½À´Ï´Ù!


4.78. ¹®¼­È­ ¹®ÀÚ¿­·ÎºÎÅÍ ¾î¶»°Ô ¹®¼­¸¦ »ý¼ºÇϳª¿ä?

gendocÀ» »ç¿ëÇϼ¼¿ä, Daniel LarsonÀÌ ¸¸µé¾ú½À´Ï´Ù. ´ÙÀ½À» ÂüÁ¶Çϼ¼¿ä

http://starship.skyport.net/crew/danilo/

ÀÌ°ÍÀº ÆÄÀ̽㠼ҽº Äڵ忡 ÀÖ´Â ¹®¼­È­ ¹®ÀÚ¿­·ÎºÎÅÍ HTMLÀ» ¸¸µé¾î ³¾ ¼ö ÀÖ½À´Ï´Ù.


4.79. ¾î¶»°Ô ÀÌÁø µ¥ÀÌŸ¸¦ Àаųª (¶Ç´Â ¾µ¼ö) ÀÖ³ª¿ä?

º¹ÀâÇÑ µ¥ÀÌŸ Æ÷¸Ë¿¡ ´ëÇؼ­´Â, struct(±¸Á¶) ¸ðµâÀ» »ç¿ëÇÏ´Â °ÍÀÌ °¡Àå ÁÁ½À´Ï´Ù. ±×°ÍÀº ¶óÀ̺귯¸® ÂüÁ¶¼­¿¡ ¹®¼­È­ µÇ¾î ÀÖ½À´Ï´Ù. ±×°ÍÀ¸·Î ÀÌÁø µ¥ÀÌŸ¸¦ (º¸ÅëÀº ¼ýÀÚµéÀ») ´ã°í ÀÖ´Â ÆÄÀÏ·Î ºÎÅÍ ¹®ÀÚ¿­À» ÃëÇÒ ¼ö ÀÖÀ¸¸ç ±×°ÍÀ» ÆÄÀ̽㠰´Ã¼·Î º¯È¯ÇÒ ¼öµµ ±×¸®°í ±× ¹Ý´ë·Î ÇÒ ¼öµµ ÀÖ½À´Ï´Ù;

¿¹¸¦ µé¾î, ´ÙÀ½ÀÇ ÄÚµå´Â µÎ °³ÀÇ 2-¹ÙÀÌÆ® Á¤¼ö¿Í ÇÑ °³ÀÇ 4-¹ÙÀÌÆ® Á¤¼ö¸¦ ÇÑ ÆÄÀÏ·Î ºÎÅÍ Å«°ª-Á¾·áÇü(big-endian) Æ÷¸ËÀ¸·Î ÀнÀ´Ï´Ù:

  import struct
  f = open(filename, "rb")  # Open in binary mode for portability
  s = f.read(8)
  x, y, z = struct.unpack(">hhl", s)
Æ÷¸Ë ¹®ÀÚ¿­ ¼Ó¿¡ ÀÖ´Â '>'´Â Å«°ª-Á¾·áÇü µ¥ÀÌŸ¸¦ °­Á¦ÇÕ´Ï´Ù; ±× ¹®ÀÚ¿­·ÎºÎÅÍ ¹®ÀÚ 'h'´Â ÇÑ°³ÀÇ "´ÜÁ¤µµ Á¤¼ö(2¹ÙÀÌÆ®)"¸¦ ÀÐ¾î µéÀÌ°í, ±×¸®°í 'l'Àº ÇÑ°³ÀÇ "¹èÁ¤µµ Á¤¼ö(4 ¹ÙÀÌÆ®)"¸¦ ÀÐ¾î µéÀÔ´Ï´Ù.

´õ¿í ±ÔÄ¢ÀûÀÎ µ¥ÀÌŸ (¿¹. Á¤¼ö ȤÀº ½Ç¼öÀÇ µ¿ÁúÀûÀÎ ¸®½ºÆ®)¿¡ ´ëÇؼ­´Â, ¹è¿­(array) ¸ðµâµµ »ç¿ëÇÒ ¼ö ÀÖÀ¸¸ç, ¶óÀ̺귯¸® ÂüÁ¶¼­¿¡ ¹®¼­È­µÇ¾î ÀÖ½À´Ï´Ù.


4.80. Å° ¿«À½À» Tkinter¿¡¼­ ÀÛµ¿½Ãų ¼ö ¾ø½À´Ï´Ù

ÀÚÁÖ-µé¸®´Â ºÒÆò¿¡ ÀÇÇϸé, bind() ¸Þ½îµå·Î »ç°Ç¿¡ ¿«ÀÎ »ç°Ç ó¸®ÀÚ°¡, ÀûÀýÇÑ Å°°¡ ´­·ÁÁú ¶§ Á¶Â÷ 󸮵ÇÁö ¾Ê´Â´Ù°í ÇÕ´Ï´Ù.

°¡Àå ÈçÇÑ ¿øÀÎÀº ¿«ÀÓÀÌ Àû¿ëµÇ´Â ±× À§Á¬ÀÌ "Å°º¸µå ÃÊÁ¡(keyboard focus)"À» °¡ÁöÁö ¾Ê´Â °ÍÀÔ´Ï´Ù. ÃÊÁ¡ ¸í·É¾î¿¡ ´ëÇؼ­´Â Tk ¹®¼­¸¦ ÂüÁ¶Çϼ¼¿ä. º¸Åë À§Á¬¿¡´Â ÀڽŠ¾È¿¡ Ŭ¸¯ÀÌ µÇ¸é Å°º¸µå ÃÊÁ¡ÀÌ ÁÖ¾îÁý´Ï´Ù (±×·¯³ª ¶óº§¿¡ ´ëÇؼ­´Â ¾Æ´Õ´Ï´Ù; (ÃÊÁ¡ ÃëÇϱâ) taketocus(takefocus?) ¼±ÅûçÇ×À» ÂüÁ¶Çϼ¼¿ä).


4.81. "import crypt"°¡ ½ÇÆÐÇÕ´Ï´Ù

[À¯´Ð½º]

ÆÄÀ̽ã 1.5ºÎÅÍ´Â, crypt ¸ðµâÀÌ ±âº»À¸·Î ¼³Á¤ºÒ°¡ÀÔ´Ï´Ù. ±×°ÍÀ» ¼³Á¤°¡´ÉÅä·Ï Çϱâ À§Çؼ­´Â, ÆÄÀ̼± ¼Ò½º Æ®¸®·Î µé¾î°¡ ÆÄÀÏ Modules/SetupÀ» ÆíÁýÇؼ­ °¡´ÉÇϵµ·Ï ÇØ¾ß ÇÕ´Ï´Ù ('#crypt'·Î ½ÃÀÛÇÏ´Â ¶óÀÎ ¾ÕÀÇ '#' Ç¥½ÄÀ» Áö¿ì¼¼¿ä). ±×¸®°í À籸ÃàÇϼ¼¿ä. ¶ÇÇÑ °°Àº ¶óÀο¡ ¹®ÀÚ¿­ '-lcrypt'¸¦ Ãß°¡ÇؾßÇÒ ÇÊ¿ä°¡ ÀÖÀ»¼öµµ ÀÖ½À´Ï´Ù.


4.82. ÆÄÀ̽ã ÇÁ·Î±×·¥¿¡ ´ëÇÑ ÄÚµù Ç¥ÁØ È¤Àº ½ºÅ¸ÀÏ Áöµµ¼­°¡ ÀÖ³ª¿ä?

³×, ±Íµµ°¡ "ÆÄÀ̽㠽ºÅ¸ÀÏ Áöµµ¼­(Python Style Guide)"¸¦ ½è½À´Ï´Ù. ´ÙÀ½ essays/styleguide.htmlÀ» º¸¼¼¿ä


4.83. ¾î¶»°Ô Tkinter ¾îÇø®ÄÉÀ̼ÇÀ» µ¶¸³½ÇÇàÆÄÀÏ·Î ¸¸µå³ª¿ä?

Freeze´Â µ¶-¸³ÀûÀÎ ¾îÇø®ÄÉÀ̼ÇÀ» »ý¼ºÇÏ´Â µµ±¸ÀÔ´Ï´Ù (4.28 ÂüÁ¶).

Tkinter ¾îÇø®ÄÉÀ̼ÇÀ» ¾ó¸± ¶§, ±× ¾îÇø®ÄÉÀ̼ÇÀº ÁøÂ¥·Î µ¶-¸³ÀûÀÌ µÇÁö´Â ¾ÊÀ» °ÍÀÔ´Ï´Ù, ±× ¾îÇø®ÄÉÀ̼ÇÀº ¿©ÀüÈ÷ tcl°ú tk ¶óÀ̺귯¸®¸¦ ÇÊ¿ä·Î ÇÕ´Ï´Ù.

ÇϳªÀÇ ÇØ°áÃ¥Àº ±× ¾îÇø®ÄÉÀ̼ÇÀ» tcl¿Í tk ¶óÀ̺귯¸®¿Í ÇÔ²² ´ã°í¼­, ȯ°æ º¯¼ö TCL_LIBRARY¿Í TK_LIBRARY¸¦ »ç¿ëÇÏ¿© ½ÇÇà-½Ã°£¿¡ ±×°ÍµéÀ» Áö½ÃÇÏ´Â °ÍÀÔ´Ï´Ù.

ÁøÂ¥·Î µ¶-¸³ÀûÀÎ ¾îÇø®ÄÉÀ̼ÇÀ» ¾òÀ¸·Á¸é, ±× ¶óÀ̺귯¸®¸¦ Çü¼ºÇÏ´Â Tcl ½ºÅ©¸³Æ®°¡ ±× ¾îÇø®ÄÉÀ̼ǿ¡ ¿ª½Ã ÅëÇյǾî¾ßÇÒ ÇÊ¿ä°¡ ÀÖ½À´Ï´Ù. ±×·¯ÇÑ °ÍÀ» Áö¿øÇÏ´Â ÇϳªÀÇ µµ±¸´Â SAM (stand-alone modules)Àε¥, Tix ¹èÆ÷º»¿¡ (http://tix.mne.com/) Æ÷ÇԵǾî ÀÖ½À´Ï´Ù. Tix¸¦ SAM »ç¿ë°¡´ÉÀ¸·Î ±¸ÃàÇϽðí, ÆÄÀ̽ãÀÇ Modules/tkappinit.c ¾È¿¡¼­ Tclsam_init µîµî¿¡ ´ëÇÑ ÀûÀýÇÑ È£ÃâÀ» ¼öÇàÇϼ¼¿ä, ±×¸®°í libtclsam¿Í libtksam¿¡ ¿¬°áÇϼ¼¿ä (Tix ¶óÀ̺귯¸® ¿ª½Ã Æ÷ÇÔÇؾßÇÒ ¼öµµ ÀÖ½À´Ï´Ù).


4.84. ¾î¶»°Ô Á¤Àû Ŭ·¡½º¿Í Á¤Àû Ŭ·¡½º ¸Þ½îµå¸¦ ¸¸µå³ª¿ä?

[ÆÀ ÇÇÅͽº(Tim Peters), tim_one@email.msn.com]

Á¤Àû µ¥ÀÌŸ´Â (C++ ȤÀº JavaÀÇ °üÁ¡¿¡¼­´Â) ½±½À´Ï´Ù; Á¤Àû ¸Þ½îµå´Â (¶Ç´Ù½Ã C++ ȤÀº Java °üÁ¡À¸·Î º¸¾Æ) Á÷Á¢ÀûÀ¸·Î Áö¿øµÇÁö ¾Ê½À´Ï´Ù.

Á¤Àû µ¥ÀÌŸ (STATIC DATA)

¿¹¸¦ µé¾î,

    class C:
        count = 0   # number of times C.__init__ called
        def __init__(self):
            C.count = C.count + 1
        def getcount(self):
            return C.count  # or return self.count
c.count´Â ¶ÇÇÑ isinstance(c, C)°¡ º¸À¯ÇÏ´Â ¸ðµç C¿¡ ´ëÇÏ¿© C.count¸¦ ÂüÁ¶ÇÕ´Ï´Ù, c ±× ÀÚü¿¡ ÀÇÇؼ­ µ¤¿© ¾º¿©Áö°Å³ª ȤÀº c.__class__¿¡¼­ºÎÅÍ °Å²Ù·Î C±îÁöÀÇ ±âº»-Ŭ·¡½º Ž»ö °æ·Î¿¡ ÀÖ´Â ¾î¶² Ŭ·¡½º¿¡ ÀÇÇÏ¿© µ¤¿©¾º¿©ÁöÁö¸¸ ¾Ê´Â´Ù¸é ¸»ÀÌÁö¿ä.

ÁÖÀÇ: CÀÇ ¸Þ½îµå ¾È¿¡¼­ ´ÙÀ½¶óÀÎÀº,

    self.count = 42
¿¬°ü¼º¾ø´Â »õ·Î¿î "count"¶ó´Â À̸§ÀÇ ½Çü º¯¼ö¸¦ selfÀÇ »çÀü¾È¿¡ »ý¼ºÇÕ´Ï´Ù. ±×·¡¼­ Ŭ·¡½º-Á¤Àû µ¥ÀÌŸ À̸§À» ´Ù½Ã ¿«À¸·Á¸é ´ÙÀ½ÀÇ ÇüÅ°¡

    C.count = 314
¸Þ½îµå ¾ÈÀÌµç ¹ÛÀ̵ç ÇÊ¿äÇÕ´Ï´Ù.

Á¤Àû ¸Þ½îµå(STATIC METHODS)

Á¤Àû ¸Þ½îµå´Â (Á¤Àû µ¥ÀÌŸ¿Í ´ëÁ¶ÇÏ¿©) ÆÄÀ̽㿡¼­ ÀÚ¿¬½º·´Áö ¸øÇÕ´Ï´Ù, ¿Ö³ÄÇÏ¸é ´ÙÀ½Àº

    C.getcount
¹­¿©ÁöÁö ¾ÊÀº ¸Þ½îµå °´Ã¼¸¦ ¹ÝȯÇϴµ¥, CÀÇ ½Çü°¡ ù ¹ø° Àμö·Î Á¦°øµÇÁö ¾Ê°í¼­´Â È£ÃâµÉ ¼ö ¾ø±â ¶§¹®ÀÔ´Ï´Ù.

Á¤Àû ¸Þ½îµåÀÇ È¿°ú¸¦ ¾ò±â À§ÇÑ ÀǵµÀûÀÎ ¹æ¹ýÀº ¸ðµâ-¼öÁØÀÇ ÇÔ¼ö¸¦ ÀÌ¿ëÇÏ´Â °ÍÀÔ´Ï´Ù:

    def getcount():
        return C.count
¸¸¾à ¿©·¯ºÐÀÇ Äڵ尡 ¸ðµâ´ç ÇϳªÀÇ Å¬·¡½º¸¦ Á¤ÀÇÇϵµ·Ï ±¸Á¶È­µÇ¾ú´Ù¸é (ȤÀº ±ä¹ÐÇÏ°Ô ¿¬°üµÈ Ŭ·¡½º °èÃþµµ¶ó¸é), ÀÌ°ÍÀº ¿øÇÏ´Â ¹ÙÀÇ Ä¸½¶È­¸¦ Á¦°øÇÕ´Ï´Ù.

µ¥ÀÚ´º½º¸¦ Ž»öÇغ¸¸é Á¤Àû ¸Þ½îµå¸¦ ¸¸µé¾î º¸±â À§ÇÑ ¸Ó¸®½Î¸Å´Â Àü·«µéÀ» ¸¹ÀÌ º¼ ¼ö ÀÖ½À´Ï´Ù. ´ëºÎºÐÀÇ »ç¶÷µéÀº ±×·¯ÇÑ Ä¡·á¾àÀÌ ±× º´º¸´Ùµµ ´õ ³ª»Ú´Ù°í ´À³§´Ï´Ù. ¾Æ¸¶µµ Á¦ÀÏ ¾àÇÑ µ¶¼ºÀ̶ó¸é ÆäÄ« Æä½Ã(Pekka Pessi) (mailto:ppessi@hut.fi)¿¡°Ô µ¹¸®°Ú½À´Ï´Ù:

    # helper class to disguise function objects
    class _static:
        def __init__(self, f):
            self.__call__ = f
    class C:
        count = 0
        def __init__(self):
            C.count = C.count + 1
        def getcount():
            return C.count
        getcount = _static(getcount)
        def sum(x, y):
            return x + y
        sum = _static(sum)
    C(); C()
    c = C()
    print C.getcount()  # prints 3
    print c.getcount()  # prints 3
    print C.sum(27, 15) # prints 42


4.85. __import__('x.y.z')´Â <module 'x'>¸¦ ¹ÝȯÇÕ´Ï´Ù; ¾î¶»°Ô z¸¦ ¾ò³ª¿ä?

´ÙÀ½°ú °°ÀÌ Çغ¸¼¼¿ä

   __import__('x.y.z').y.z
´õ Çö½ÇÀûÀÎ »óȲ¿¡ ´ëÇؼ­´Â, ´ÙÀ½°ú °°ÀÌ ÇؾßÇÒ Áöµµ ¸ð¸£°Ú½À´Ï´Ù

   m = __import__(s)
   for i in string.split(s, ".")[1:]:
       m = getattr(m, i)


4.86. ±âº»ÀûÀÎ ¾²·¹µå »ó½Ä

²À ÁÖÀÇÇÏ½Ç °ÍÀº ÆÄÀ̽ã 2.1 ÇöÀç·Î ÆÄÀ̽ãÀÇ ¾²·¹µå ¸ðµ¨À» »ç¿ëÇÏ¿© ´ÙÁß Ã³¸® Çϵå¿þ¾î¸¦ ÀÌ¿ëÇÒ ¹æ¹ýÀº ¾ø½À´Ï´Ù. ÆÄÀ̽ãÀº Àü¿ª ÀÚ¹°¼è (global lock)À» »ç¿ëÇϴµ¥, ´ÙÁß ½º·¹µå°¡ µ¿½Ã¿¡ ÀÛµ¿ÇÏ´Â °ÍÀ» Çã¿ëÇÏÁö ¾Ê½À´Ï´Ù.

¸¸¾à ´ÙÀ½°ú °°Àº °£´ÜÇÑ Å×½ºÆ® ÇÁ·Î±×·¥À» ÀÛ¼ºÇØ º¸½Ã¸é:

  import thread
  def run(name, n):
      for i in range(n): print name, i
  for i in range(10):
      thread.start_new(run, (i, 100))
¾î¶² ¾²·¹µåµµ ½ÇÇàµÇÁö ¾Ê´Â µíÀÌ º¸ÀÔ´Ï´Ù! ±× ÀÌÀ¯´Â ÁÖ ¾²·¹µå°¡ Á¾·áÇÏÀÚ ¸¶ÀÚ, ¸ðµç ¾²·¹µå°¡ »ç¸ÁÇϱ⠶§¹®ÀÔ´Ï´Ù.

°£´ÜÇÑ ÇØ°áÃ¥Àº ±× ÇÁ·Î±×·¥ÀÇ ¸¶Áö¸·¿¡ sleepÀ» Ãß°¡ÇÏ´Â °ÍÀε¥, ¸ðµç ¾²·¹µå°¡ ³¡³ª±â À§Çؼ­ ÃæºÐÈ÷ ±ä ½Ã°£À» ÁÖ´Â °ÍÀÔ´Ï´Ù:

  import thread, time
  def run(name, n):
      for i in range(n): print name, i
  for i in range(10):
      thread.start_new(run, (i, 100))
  time.sleep(10) # <----------------------------!
±×·¯³ª ÀÌÁ¦ (¸¹Àº Ç÷§Æû¿¡¼­) ±× ¾²·¹µåµéÀº º´·ÄÀûÀ¸·Î ½ÇÇàµÇÁö ¾Ê½À´Ï´Ù, ±×·¯³ª Çѹø¿¡ Çϳª¾¿, ¿¬¼ÓÀûÀ¸·Î ½ÇÇàµÇ´Â µíÀÌ º¸ÀÔ´Ï´Ù! ±× ÀÌÀ¯´Â OSÀÇ ¾²·¹µå ½ºÄÉÁì·¯°¡ ÀÌ ÀüÀÇ ¾²·¹µå°¡ Á¤Áö´çÇÒ ¶§±îÁö´Â »õ·Î¿î ¾²·¹µå¸¦ ½ÃÀÛ½ÃÅ°Áö ¾Ê±â ¶§¹®ÀÔ´Ï´Ù.

°£´ÜÇÑ ÇØ°áÃ¥Àº ÀÛÀº sleepÀ» ±× ½ÇÇà ÇÔ¼öÀÇ ½ÃÀۺο¡ Ãß°¡ÇÏ´Â °ÍÀÔ´Ï´Ù:

  import thread, time
  def run(name, n):
      time.sleep(0.001) # <---------------------!
      for i in range(n): print name, i
  for i in range(10):
      thread.start_new(run, (i, 100))
  time.sleep(10)
´õ ÈùÆ®¸¦ µéÀÚ¸é:

time.sleep() È£ÃâÀ» ¸¶Áö¸·¿¡ »ç¿ëÇÏ´Â ´ë½Å¿¡, ¼¼¸¶Æ÷¾î ¸ÞÄ«´ÏÁò·ùÀÇ °ÍÀ» »ç¿ëÇÏ´Â °ÍÀÌ ´õ ÁÁ½À´Ï´Ù. ÇϳªÀÇ ¾ÆÀ̵ð¾î´Â Queue ¸ðµâÀ» »ç¿ëÇÏ¿© queue °´Ã¼¸¦ »ý¼ºÇÏ°í, °¢ ¾²·¹µå°¡ Á¾·áÇÒ ¶§ ±× Å¥¿¡ ÅäÅ«À» Ãß°¡Çϵµ·Ï Çϸç, ÁÖ ¾²·¹µå°¡ ¾²·¹µå ¼ö¸¸Å­ÀÇ ÅäÅ«À» ±× Å¥·ÎºÎÅÍ Àеµ·Ï ÇÏ´Â °ÍÀÔ´Ï´Ù.

¾²·¹µå ¸ðµâ ´ë½Å¿¡ ±× ¾²·¹µù ¸ðµâÀ» »ç¿ëÇϼ¼¿ä. ±×°ÍÀº ÆÄÀ̽㠹öÀü 1.5.1ÀÌÈÄ¿¡ Æ÷ÇԵǾî ÀÖ½À´Ï´Ù. ±×°ÍÀº ÀÌ·¯ÇÑ ÀÚÁú±¸·¹ÇÑ ¸ðµç °ÍµéÀ» ó¸®ÇØ ÁÖ¸ç, ´Ù¸¥ ¸¹Àº ¸ÚÁø »ç¾çµé ¿ª½Ã °¡Áö°í ÀÖ½À´Ï´Ù!


4.87. sys.stdout (stdin, stderr)À» ´Ý¾Ò´Âµ¥ ¿Ö ½ÇÁ¦·Î ´ÝÈ÷Áö ¾Ê³ª¿ä?

ÆÄÀ̽ã ÆÄÀÏ °´Ã¼´Â C ½ºÆ®¸²ÀÇ À§¿¡ ½×¾Æ ³õÀº °í-¼öÁØ Ãß»óÈ­ ÃþÀ̸ç, C ½ºÆ®¸²Àº À̹ø¿¡´Â (´Ù¸¥ °Íµé Áß¿¡) Àú-¼öÁØ C ÆÄÀÏ ±â¼úÀÚ À§¿¡ ½×Àº Áß-¼öÁØ Ãß»óÈ­ ÃþÀÔ´Ï´Ù.

ÆÄÀ̽㿡¼­´Â ´ëºÎºÐÀÇ ÆÄÀÏ °´Ã¼ f¸¦ À§Çؼ­ ³»Àå ÇÔ¼ö "open"À» ÅëÇÏ¿© ÀÛ¼ºÇϴµ¥, f.close()´Â ÆÄÀ̽ãÀÇ °üÁ¡¿¡¼­ º¸¸é ±× ÆÄÀÏ °´Ã¼¿¡ ´ÝÇôÁø °ÍÀ¸·Î Ç¥½ÄÀ» ³²±â¸ç, ¶ÇÇÑ ±âÀú¿¡ ÀÖ´Â C ½ºÆ®¸²À» ´Ýµµ·Ï Á¶Ä¡ÇÕ´Ï´Ù. f°¡ ¾²·¹±â°¡ µÇ¸é, fÀÇ ¼Ò¸êÀÚ ¾È¿¡¼­ ÀÌ°Í ¿ª½Ã ÀÚµ¿ÀûÀ¸·Î ÀϾ´Ï´Ù.

±×·¯³ª stdin, stdout ±×¸®°í stderr´Â ÆÄÀ̽㿡¼­ Ưº°ÇÏ°Ô Ãë±ÞµÇ´Âµ¥, C ¿¡ ÀÇÇؼ­µµ Ưº°ÇÑ ÁöÀ§°¡ ÁÖ¾îÁö±â ¶§¹®ÀÔ´Ï´Ù: ´ÙÀ½°ú °°ÀÌ Çϸé

    sys.stdout.close() # ditto for stdin and stderr
ÆÄÀ̽ã-¼öÁØÀÇ ÆÄÀÏ °´Ã¼¸¦ ´ÝÇôÁø °ÍÀ¸·Î Ç¥½ÄÀ» ³²±é´Ï´Ù, ±×·¯³ª (¸¸¾à sys.stdoutÀÌ ¿©ÀüÈ÷ ±×ÀÇ ±âº» °ª¿¡ ¿«¿© ÀÖ´Ù¸é, ±×°Í ¿ª½Ã C°¡ "stdout"À̶ó°í ºÎ¸£´Â ½ºÆ®¸²ÀÔ´Ï´Ù) ±×¿Í °ü·ÃµÈ C ½ºÆ®¸²À» ´ÝÁö ¾Ê½À´Ï´Ù.

ÀÌ·¯ÇÑ ¼¼°³Áß Çϳª¸¦ À§ÇÑ ±âÀúÀÇ C ½ºÆ®¸²À» ´ÝÀ¸·Á¸é, ±×°ÍÀÌ ÁøÂ¥ ¿øÇÏ´Â °ÍÀÎÁö¸¦ ¸ÕÀú È®ÀÎÇØ¾ß ÇÕ´Ï´Ù (¿¹¸¦ µé¾î, ¿©·¯ºÐÀº ÀÔÃâ·ÂÀ» ½ÃµµÇÏ´Â È®Àå ¸ðµâ°ú ±× Á¶ÀÛÀ» È¥µ¿ÇÒ ¼öµµ ÀÖ½À´Ï´Ù). ¸¸¾à ±×·¸´Ù¸é, os.close¸¦ »ç¿ëÇϼ¼¿ä:

    os.close(0)   # close C's stdin stream
    os.close(1)   # close C's stdout stream
    os.close(2)   # close C's stderr stream


4.88. ¾î¶² Á¾·ùÀÇ Àü¿ª °ª º¯È¯ÀÌ ¾²·¹µå-¾ÈÀü ÇÑ°¡¿ä?

[adapted from c.l.py responses by Gordon McMillan &GvR]

Àü¿ª ÀÎÅÍÇÁ¸®ÅÍ Àá±ÝÀº ÇÑ ¹ø¿¡ ¿ÀÁ÷ ÇÑ °³ÀÇ ¾²·¹µå°¡ ÆÄÀ̽㠰¡»ó±â°è¿¡¼­ ½ÇÇàµÇ´Â°¡¸¦ ³»ºÎÀûÀ¸·ÎÈ®ÀÎÇϱâ À§ÇØ »ç¿ëµË´Ï´Ù. ÀϹÝÀûÀ¸·Î, ÆÄÀ̽ãÀº ¿ÀÁ÷ ¹ÙÀÌÆ®ÄÚµå Áö½Ã¾î »çÀÌ¿¡¼­¸¸ ¾²·¹µå°£ ÀüȯÀ» Á¦°øÇÕ´Ï´Ù (¾ó¸¶³ª ÀÚÁÖ ÀüȯÀ» Á¦°øÇÏ´À³Ä´Â sys.setcheckinterval¸¦ ÅëÇÏ¿© ¼³Á¤µÉ ¼ö ÀÖ½À´Ï´Ù). °¢ ¹ÙÀÌÆ®ÄÚµå Áö½Ã¾î´Â -- ±×¸®°í ±×°ÍÀ¸·ÎºÎÅÍ µµ´ÞµÇ´Â ¸ðµç C ±¸Çö ÄÚµå´Â -- ±×·¯¹Ç·Î ¿øÀÚÀûÀÔ´Ï´Ù.

ÀÌ·ÐÀûÀ¸·Î, ÀÌ°ÍÀÌ ÀǹÌÇÏ´Â ¹Ù´Â, Á¤È®ÇÑ °è»êÀ» À§Çؼ­´Â PVM ¹ÙÀÌÆ® ÄÚµå ±¸Çö¿¡ ´ëÇÑ Á¤È®ÇÑ ÀÌÇظ¦ ¿ä±¸ÇÑ´Ù´Â °ÍÀÔ´Ï´Ù. ½ÇÁ¦ÀûÀ¸·Î, ÀÌ°ÍÀÌ ÀǹÌÇÏ´Â ¹Ù´Â, "¿øÀÚÀûÀ¸·Î º¸ÀÌ´Â" ³»Àå µ¥ÀÌŸ(Á¤¼ö, ¸®½ºÆ®, »çÀü, µîµî) ÇüÀÎ °øÀ¯ º¯¼öµé¿¡ ´ëÇÑ Ã³¸®°¡ ÁøÂ¥·Î ¿øÀÚÀûÀ̶ó´Â °ÍÀÔ´Ï´Ù.

¿¹¸¦ µé¾î, ÀÌ·¯ÇÑ °ÍµéÀº ¿øÀÚÀûÀÔ´Ï´Ù (L, L1, L2Àº ¸®½ºÆ®À̸ç , D, D1, D2´Â »çÀü, x, y´Â °´Ã¼ÀÌ°í, i, j ´Â Á¤¼öÀÔ´Ï´Ù):

    L.append(x)
     L1.extend(L2)
    x = L[i]
    x = L.pop()
    L1[i:j] = L2
    L.sort()
    x = y
    x.field = y
    D[x] = y
    D1.update(D2)
    D.keys()
ÀÌ·¯ÇÑ °ÍµéÀº ¿øÀÚÀûÀÌÁö ¾Ê½À´Ï´Ù:

    i = i+1
    L.append(L[-1])
    L[i] = L[j]
    D[x] = D[x] + 1
ÁÖÀÇ: ´Ù¸¥ °´Ã¼µéÀ» ´ëüÇÏ´Â ¿¬»êÀº ÂüÁ¶È½¼ö°¡ 0 ¿¡ µµ´Þ ÇÒ ¶§ ´Ù¸¥ °´Ã¼µéÀÇ __del__ ¸Þ½îµå¸¦ È£ÃâÇÒ °¡´É¼ºÀÌ ÀÖ½À´Ï´Ù, ±×¸®°í ±×°ÍÀº ´Ù¸¥ °Íµé¿¡ ¿µÇâÀ» ¹ÌÄ¥ ¼ö ÀÖ½À´Ï´Ù. ÀÌ°ÍÀº ƯÈ÷ »çÀü°ú ¸®½ºÆ®¿¡ ´ëÇÑ ´ë·®ÀÇ °»½Å¿¡µµ Àû¿ëµË´Ï´Ù. Àǽɽº·¯¿ï ¶§´Â, mutex¸¦ »ç¿ëÇϼ¼¿ä!


4.89. ¾î¶»°Ô ÀûÀýÇÏ°Ô ¹®ÀÚ¿­À» ¼öÁ¤Çϳª¿ä?

¹®ÀÚ¿­À» º¯°æºÒ°¡ÀÔ´Ï´Ù (Áú¹® 6.2 ÂüÁ¶) ±×·¡¼­ Á÷Á¢ÀûÀ¸·Î´Â ¹®ÀÚ¿­À» ¼öÁ¤ÇÒ ¼ö ¾ø½À´Ï´Ù. ÀÌ·¯ÇÑ ±â´ÉÀ» °¡Áö´Â °´Ã¼°¡ ÇÊ¿äÇϸé, ±× ¹®ÀÚ¿­À» ¸®½ºÆ®·Î º¯È¯ÇØ º¸½Ã°Å³ª ȤÀº ¹è¿­(array) ¸ðµâÀ» »ìÆì º¸¼¼¿ä.

    >>> s = "Hello, world"
    >>> a = list(s)
    >>> print a
    ['H', 'e', 'l', 'l', 'o', ',', ' ', 'w', 'o', 'r', 'l', 'd']
    >>> a[7:] = list("there!")
    >>> import string
    >>> print string.join(a, '')
    'Hello, there!'
    >>> import array
    >>> a = array.array('c', s)
    >>> print a
    array('c', 'Hello, world')
    >>> a[0] = 'y' ; print a
    array('c', 'yello world')
    >>> a.tostring()
    'yello, world'


4.90. Å°¿öµå/¼±ÅÃÀûÀÎ ¸Å°³º¯¼ö/ÀμöµéÀ» °Ç³×´Â ¹ý

Q: ¾î¶»°Ô ÇϳªÀÇ ÇÔ¼ö·ÎºÎÅÍ ¼±ÅÃÀûÀΠȤÀº Å°¿öµå ¸Å°³º¯¼ö¸¦ ¶Ç ´Ù¸¥ ÇÔ¼ö¿¡
   °Ç³× ÁÙ¼ö ÀÖ³ª¿ä?
A: 'apply'¸¦ »ç¿ëÇϼ¼¿ä, ´ÙÀ½°ú °°ÀÌ:

	def f1(a, *b, **c):
		...

	def f2(x, *y, **z):
		...
		z['width']='14.3c'
		...
		apply(f1, (x,)+y, z)


4.91. ¾î¶»°Ô »çÀüÀÌ ÀÏ°üµÈ ¼ø¼­·Î ±× Å°µéÀ» Ãâ·Âµµ·Ï Çϳª¿ä?

ÀϹÝÀûÀ¸·Î, »çÀüÀº Å°¸¦ ¿¹»óÇÒ ¼ö¾ø´Â ¼ø¼­·Î ÀúÀåÇÕ´Ï´Ù, ±×·¡¼­ »çÀüÀÇ ¿ä¼ÒµéÀ» Ãâ·ÂÇÏ´Â ¼ø¼­µµ ºñ½ÁÇÏ°Ô ¿¹»óÇÒ ¼ö ¾ø½À´Ï´Ù. (Áú¹® 6.12¸¦ º¸½Ã¸é ¿Ö ±×·±Áö ÀÌÇØÇÏ½Ç ¼ö ÀÖ½À´Ï´Ù.)

¸¸¾à Ãâ·Â°¡´É ¹öÀüÀ» ÆÄÀÏ¿¡ ÀúÀåÇÏ°í, ¾à°£ÀÇ º¯°æÀ» ÇÏ°í ³ª¼­ ±×°ÍÀ» ´Ù¸¥ ¾î¶² Ãâ·ÂµÈ »çÀü°ú ºñ±³ÇØ º¸±â¸¦ ¿øÇÑ´Ù¸é ÀÌ°ÍÀº °í¹Î½º·¯¿ï ¼ö ÀÖ½À´Ï´Ù. ¸¸¾à ±×·¯ÇÑ Çʿ伺ÀÌ ÀÖ´Ù¸é UserDict.UserDict¸¦ ÇϺÎŬ·¡½ºÈ­ÇÏ¿© ¿¹»ó°¡´ÉÇÑ ¼ø¼­·Î ÀÚ½ÅÀ» Ãâ·ÂÇÏ´Â SortedDict Ŭ·¡½º¸¦ ¸¸µé ¼ö ÀÖ½À´Ï´Ù. ¿©±â¿¡ ±×·¯ÇÑ Å¬·¡½º¸¦ °£°áÇÏ°Ô ±¸ÇöÇÑ Å¬·¡½º°¡ ÀÖ½À´Ï´Ù:

  import UserDict, string
  class SortedDict(UserDict.UserDict):
    def __repr__(self):
      result = []
      append = result.append
      keys = self.data.keys()
      keys.sort()
      for k in keys:
        append("%s: %s" % (`k`, `self.data[k]`))
      return "{%s}" % string.join(result, ", ")
    ___str__ = __repr__

ºñ·Ï ¿Ïº®ÇÑ ÇØ°áÃ¥Àº ¾Æ´ÏÁö¸¸, ÀÌ°ÍÀº ¸¶ÁÖÄ¥ ¼ö ÀÖ´Â ÀϹÝÀûÀÎ ¸¹Àº »óȲ¿¡ Àß ÀÛµ¿ÇÒ °ÍÀÔ´Ï´Ù. (±×°ÍÀº pprint ¸ðµâ¿¡ ¾î¶°ÇÑ ¿µÇâµµ ¹ÌÄ¡Áö ¾ÊÀ» °ÍÀÔ´Ï´Ù ±×¸®°í »çÀüÀ̵簡 ȤÀº »çÀüÀ» Æ÷ÇÔÇÑ °ªµéÀ» Åõ¸íÇÏ°Ô Ã³¸®ÇÏÁö ¾ÊÀ» °ÍÀÔ´Ï´Ù).


4.92. ÆÄÀ̽ã Áöħ¼­°¡ ÀÖ½À´Ï±î?

³×, ´ÙÀ½ pyfaq01.htm#1.20 Áú¹® 1.20À» ÂüÁ¶Çϼ¼¿ä


4.93. ¾î¶»°Ô ÆÄÀ̽㠾îÇø®ÄÉÀ̼ÇÀ» µ¶-¸³ÀûÀÎ ÇÁ·Î±×·¥À¸·Î ÄÄÆÄÀÏÇϳª¿ä?

ºñ·Ï °³¹ßµÇ°í ÀÖ´Â ÆÄÀ̽ã ÄÄÆÄÀÏ·¯°¡ ÀÖ±â´Â ÇÏÁö¸¸, ¿øÇÏ´Â ¹Ù°¡ µ¶-¸³ÀûÀÎ ÇÁ·Î±×·¥À̶ó¸é, ¾Æ¸¶µµ ½ÇÁ¦(real) ÄÄÆÄÀÏ·¯°¡ ÇÊ¿äÇÏÁö´Â ¾ÊÀ» °ÍÀÔ´Ï´Ù.

Çϳª´Â freeze µµ±¸¸¦ »ç¿ëÇÏ´Â °ÍÀε¥, ÆÄÀ̽㠼ҽº Æ®¸®¿¡ Tools/freeze·Î Æ÷ÇԵǾî ÀÖ½À´Ï´Ù. ±×°ÍÀº ÆÄÀ̽㠹ÙÀÌÆ® ÄÚµå C ¹è¿­·Î º¯È¯ÇÕ´Ï´Ù. C ÄÄÆÄÀÏ·¯¸¦ »ç¿ëÇؼ­, ¿©·¯ºÐÀÇ ¸ðµç ¸ðµâÀ» »õ·Î¿î ÇÁ·Î±×·¥À¸·Î ³»ÀåÇÒ ¼ö ÀÖ½À´Ï´Ù, ±×·¯¸é Ç¥ÁØ ÆÄÀ̽㠸ðµâ°ú ¿¬°áµË´Ï´Ù.

À©µµ¿ì¿¡¼­, ¶Ç´Ù¸¥ ÇØ°áÃ¥ÀÌ Á¸ÀçÇϴµ¥ C ÄÄÆÄÀÏ·¯¸¦ ÇÊ¿ä·Î ÇÏÁö ¾Ê½À´Ï´Ù. Å©¸®½ºÃ® µð½º¸Ó(Christian Tismer)ÀÇ SQFREEZE (http://starship.python.net/crew/pirx/)´Â ±× ¹ÙÀÌÆ® Äڵ带 Ưº°ÇÏ°Ô-ÁغñµÈ ÆÄÀ̽ã ÀÎÅÍÇÁ¸®ÅÍ¿¡ Ãß°¡ÇÕ´Ï´Ù, ±× ÀÎÅÍÇÁ¸®ÅÍ´Â ±× ¹ÙÀÌÆ® Äڵ带 ½ÇÇàÇüÀ¸·Î ÀÌÇØÇÒ °ÍÀÔ´Ï´Ù.

°íµç ¸Æ¹Ð¶õ(Gordon McMillian)ÀÌ Á¦°øÇÏ´Â ¼³Ä¡±â´Â (http://starship.python.net/crew/gmcm/distribute.html) ¼¼¹ø° ´ë¾ÈÀ¸·Î¼­, SQFREEZE¿Í À¯»çÇÏ°Ô ÀÛµ¿ÇÏÁö¸¸, ÀÓÀÇÀûÀÎ Ãß°¡ ÆÄÀϵµ ±× µ¶¸³ ÀÌÁø ÆÄÀÏ¿¡ Æ÷ÇÔÇϵµ·Ï Çã¿ëÇÕ´Ï´Ù.


4.94. ¾î¶»°Ô ºí·ÎÅ· ¾øÀÌ ÇϳªÀÇ Å°´­¸²À» ¾ò³ª¿ä?

´Ù¼öÀÇ ÇØ°áÃ¥ÀÌ ÀÖ½À´Ï´Ù; ¾î¶² °ÍÀº curses¸¦ »ç¿ëÇÏ´Â °ÍÀε¥, ´ë´ÜÈ÷ ¹è¿ì±â ¾î·Æ½À´Ï´Ù. ¿©±â¿¡ curses¸¦ »ç¿ëÇÏÁö ¾Ê´Â ÇØ°áÃ¥ÀÌ ÀÖ½À´Ï´Ù.

        import termios, TERMIOS, fcntl, FCNTL, sys, os
        fd = sys.stdin.fileno()
        oldterm = termios.tcgetattr(fd)
        newattr = termios.tcgetattr(fd)
        newattr[3] = newattr[3] & ~TERMIOS.ICANON & ~TERMIOS.ECHO
        termios.tcsetattr(fd, TERMIOS.TCSANOW, newattr)
        oldflags = fcntl.fcntl(fd,FCNTL.F_GETFL)
        fcntl.fcntl(fd,FCNTL.F_SETFL,oldflags|FCNTL.O_NONBLOCK)
        try:
            while 1:
                try:
                 c = sys.stdin.read(1)
                  print "Got character", `c`
                except IOError:  pass   # Ignore IOError from empty buff
        finally:
            termios.tcsetattr(fd, TERMIOS.TCSAFLUSH, oldterm)
            fcntl.fcntl(fd,FCNTL.F_SETFL,oldflags)
ÀÌ°ÍÀÌ ÀÛµ¿ÇÏ·Á¸é termios¿Í fcntl ¸ðµâÀÌ ÇÊ¿äÇÕ´Ï´Ù, ¸®´ª½º¿¡¼­¸¸ ½ÃµµÇØ º¸¾ÒÁö¸¸, ´Ù¸¥ °÷¿¡¼­µµ ÀÛµ¿Çϸ®¶ó º¾´Ï´Ù.

ÀÌ Äڵ忡¼­´Â, ¹®ÀÚµéÀÌ ÇÑ ¹ø¿¡ ÇÑ°³¾¿ ÀÐÇôÁö°í Ãâ·ÂµË´Ï´Ù.

termios.tcsetattr()Àº stdinÀÇ ¹ÝÇâÀ» ²ô°í Ç¥ÁØ(canonical) ¸ðµå¸¦ »ç¿ëºÒ´ÉÀ¸·Î ¸¸µì´Ï´Ù. fcntl.fnctl() stdinÀÇ ÆÄÀÏ ±â¼úÀÚ ±ê¹ßÀ» ȹµæÇÏ°í ±×°ÍµéÀ» ºñ-ºí·ÎÅ·(non-blocking) ¸ðµå·Î º¯°æÇϴµ¥ »ç¿ëµË´Ï´Ù. ºñ¾îÀÖÀ» ¶§ stdinÀ» Àд °ÍÀº IOError¸¦ ÀÏÀ¸Å°¹Ç·Î, ÀÌ ¿¡·¯´Â ³ªÆ÷µÇ°í ¹«½ÃµË´Ï´Ù.


4.95. ÆÞÀÇ chomp()¿Í µ¿µîÇÑ °ÍÀÌ ÀÖ³ª¿ä? (¹®ÀÚ¿­¿¡¼­ ²ø¸®´Â newlineÀ» Á¦°ÅÇÏ´Â °Í)

µÎ °³ÀÇ ºÎºÐÀûÀÎ ´ë¾ÈÀÌ ÀÖ½À´Ï´Ù. ¸¸¾à ¸ðµç À̲ø¸®´Â °ø¹éÀ» Á¦°ÅÇÏ·Á¸é, ¸Þ½îµå string.rstrip()À» »ç¿ëÇϼ¼¿ä. ±×·¸Áö ¾Ê°í, ±× ¹®ÀÚ¿­¿¡ ¿ÀÁ÷ ÇÑ°³ÀÇ ¶óÀθ¸ ÀÖ´Ù¸é, string.splitlines()[0]À» »ç¿ëÇϼ¼¿ä.

 -----------------------------------------------------------------------
 rstrip()Àº ³Ê¹« ¿å½ÉÀÌ ¸¹¾Æ¼­, ¸ðµç À̲ø¸®´Â °ø¹éµéÀ» Á¦°ÅÇÕ´Ï´Ù.
 splitlines()´Â ControlMÀ» ¶óÀÎ °æ°è°ªÀ¸·Î ÃëÇÕ´Ï´Ù.
 ÀÌ ¹®ÀÚ¿­µéÀ» ÀÔ·ÂÀ̶ó°í °£ÁÖÇØ º¸¸é:
   "python python    \r\n"
   "python\rpython\r\n"
   "python python   \r\r\r\n"
 rstrip()/splitlines()À¸·ÎºÎÅÍ µ¹¾Æ¿Â °á°ú´Â ¾Æ¸¶µµ ¿ì¸®°¡ ¿øÇÑ °ÍÀÌ ¾Æ´Ò °ÍÀÔ´Ï´Ù.
 º¸±â¿¡´Â re°¡ ÀÌ ÀÛ¾÷À» ¼öÇàÇÒ ¼ö ÀÖ´Â °Í °°½À´Ï´Ù.

 #!/usr/bin/python
 # requires python2
 import re, os, StringIO
 lines=StringIO.StringIO(
   "The Python Programming Language\r\n"
   "The Python Programming Language \r \r \r\r\n"
   "The\rProgramming\rLanguage\r\n"
   "The\rProgramming\rLanguage\r\r\r\r\n"
   "The\r\rProgramming\r\rLanguage\r\r\r\r\n"
 )
 ln=re.compile("(?:[\r]?\n|\r)$") # dos:\r\n, unix:\n, mac:\r, others
: unknown
 # os.linesep does not work if someone ftps(in binary mode) a dos/mac text file
 # to your unix box
 #ln=re.compile(os.linesep + "$")
 while 1:
   s=lines.readline()
   if not s: break
   print "1.(%s)" % `s.rstrip()`
   print "2.(%s)" % `ln.sub( "", s, 1)`
   print "3.(%s)" % `s.splitlines()[0]`
   print "4.(%s)" % `s.splitlines()`
   print
 lines.close()


4.96. (¸®½ºÆ®, ÅÍÇÃ, ¿¬¼Ó¿­)ÀÇ ¿ä¼ÒµéÀ» ½ÇÁ¦·Î °áÇÕÇÒ ¶§ join()Àº ¿Ö ¹®ÀÚ¿­ ¸Þ½îµåÀΰ¡¿ä?

¹®ÀÚ¿­Àº ¹èÆ÷º» 1.6ºÎÅÍ´Â ´Ù¸¥ Ç¥ÁØ Çüµé°ú °ÅÀÇ °°°Ô µÇ¾ú½À´Ï´Ù, ¸Þ½îµå´Â Ãß°¡µÇ¾î string ¸ðµâÀÇ ±â´ÉÀ» »ç¿ëÇÏ¿© ¾ðÁ¦³ª ÀÌ¿ë°¡´ÉÇÏ´ø ±â´É°ú µ¿ÀÏÇÑ ±â´ÉÀ» Á¦°øÇÕ´Ï´Ù. ÀÌ·¯ÇÑ »õ·Î¿î ¸Þ½îµå´Â ±¤¹üÀ§ÇÏ°Ô ¹Þ¾Æµé¿©Á³½À´Ï´Ù, ±×·¯³ª (¾î¶²) ÇÁ·Î±×·¡¸ÓµéÀ» ºÒÆíÇÏ°Ô ´À³¢°Ô ¸¸µå´Â °ÍÀ̶ó¸é:

    ", ".join([1, 2, 4, 8, 16])
ÀÌ°ÍÀº ´ÙÀ½ÀÇ °á°ú¸¦ »êÃâÇÕ´Ï´Ù

    "1, 2, 4, 8, 16"
ÀÌ·¯ÇÑ »ç¿ë¹ý¿¡ ´ëÇؼ­´Â µÎ °³ÀÇ ÀϹÝÀûÀÎ ¹Ý·ÐÀÌ ÀÖ½À´Ï´Ù.

±× ù ¹ø°´Â ´ÙÀ½ ¶óÀο¡ ÀÐÇôÁö´Â ´ë·Î ÀÔ´Ï´Ù: "¹®ÀÚ¿­ ±âÈ£ (¹®ÀÚ¿­ »ó¼ö)ÀÇ ¸Þ½îµå¸¦ »ç¿ëÇÏ´Â °ÍÀº Á¤¸» º¸±â¿¡ ÈäÇÏ´Ù", ÀÌ°Í¿¡ ´ëÇÑ ´ë´äÀº ´ÙÀ½°ú °°½À´Ï´Ù. ±×·² ¼öµµ ÀÖÁö¸¸, ¹®ÀÚ¿­ ±âÈ£´Â ´ÜÁö °íÁ¤µÈ °ªÀÔ´Ï´Ù. ¸¸¾à ±× ¸Þ½îµåµéÀÌ ¹®ÀÚ¿­¿¡ ¿«¿©Áø À̸§µé¿¡ Çã¿ëµÈ´Ù¸é ±âÈ£»óÀ¸·Î ºÒ°¡´ÉÇÏ°Ô ÇØ¾ß ÇÒ ³í¸®ÀûÀÎ ÀÌÀ¯°¡ ¾ø½À´Ï´Ù. ³Ñ¾î¾ßÇÒ »êÀÔ´Ï´Ù!

µÎ ¹ø° ¹Ý´ë´Â ÀüÇüÀûÀ¸·Î ´ÙÀ½°ú °°ÀÌ ´øÁ®Áý´Ï´Ù: "³ª´Â ¿¬¼Ó¿­ÀÌ ±×ÀÇ ±¸¼º¿øµéÀ» ¹®ÀÚ¿­ »ó¼ö¿Í ÇÔ²² °áÇÕÇϱ⸦ ÁøÁ¤À¸·Î ¹Ù¶õ´Ù." ½½ÇÁ°Ôµµ, ±×·² ¼ö ¾ø½À´Ï´Ù. ¾î¶² ÀÌÀ¯ ¶§¹®¿¡ split()À» ¹®ÀÚ¿­ ¸Þ½îµå·Î °£ÁÖÇϴµ¥¿¡´Â Å« ¾î·Á¿òÀÌ ¾ø¾î º¸ÀÔ´Ï´Ù, ¿Ö³ÄÇϸé ÀÌ °æ¿ì¿¡ ´ÙÀ½Àº

    "1, 2, 4, 8, 16".split(", ")
ÁÖ¾îÁø ±¸ºÐÀÚ¿¡ ÀÇÇؼ­ ±¸ºÐµÈ ÇϺι®ÀÚ¿­À» ¹®ÀÚ¿­ ±âÈ£¿¡°Ô ¹ÝȯÇ϶ó´Â Áö½Ã¶ó°í ÀÌÇØÇÏ´Â °ÍÀÌ ½±½À´Ï´Ù (ȤÀº, ±âº»°ªÀ¸·Î, ÀÓÀÇÀÇ ¼öÇàÀº °ø¹é). ÀÌ °æ¿ì¿¡ À¯´ÏÄÚµå ¹®ÀÚ¿­Àº À¯´ÏÄÚµå ¹®ÀÚ¿­À» ´ãÀº ¸®½ºÆ®¸¦ ¹ÝȯÇÏ°í, ¾Æ½ºÅ° ¹®ÀÚ¿­À» ¾Æ½ºÅ° ¹®ÀÚ¿­À» ´ãÀº ¸®½ºÆ®¸¦ ¹ÝȯÇÏ°í ±×¸®°í ¸ðµç »ç¶÷Àº ÇູÇÕ´Ï´Ù.

join()Àº ¹®ÀÚ¿­ ¸Þ½îµåÀÔ´Ï´Ù. ¿Ö³ÄÇÏ¸é ±×°ÍÀ» »ç¿ëÇÏ°í ÀÖ´Â µ¿¾È¿¡ ÀÓÀÇÀÇ ¿¬¼Ó¿­¿¡ ´ëÇÏ¿© ±× ±¸ºÐ ¹®ÀÚ¿­ÀÌ ¹Ýº¹µÇµµ·Ï Áö½ÃÇÏ°í, °¢ ¿ä¼ÒÀÇ ¹®ÀÚ¿­ Ç¥ÇöÀ» Çü¼ºÇϸç, ±×¸®°í ÀÚ½ÅÀ» ±× ¿ä¼ÒµéÀÇ Ç¥Çö »çÀÌ¿¡ »ðÀÔÇÏ°í Àֱ⠶§¹®ÀÔ´Ï´Ù. ÀÌ ¸Þ½îµå´Â ¿¬¼Ó¿­ °´Ã¼¸¦ À§ÇÑ ±ÔÄ¢À» ÁؼöÇÏ´Â ¸ðµç Àμö¿Í ÇÔ²² »ç¿ëµÉ ¼ö ÀÖ½À´Ï´Ù, ¿©±â¿¡´Â ½º½º·Î Á¤ÀÇÇÑ »õ·Î¿î Ŭ·¡½º¸¦ Æ÷ÇԵ˴ϴÙ.

ÀÌ°ÍÀº ¹®ÀÚ¿­ ¸Þ½îµåÀ̹ǷΠÀ¯´ÏÄÚµå ¹®ÀÚ¿­ »Ó¸¸ ¾Æ´Ï¶ó Æò¹® ¾Æ½ºÅ° ¹®ÀÚ¿­¿¡µµ ÀÛµ¿ÇÒ ¼ö ÀÖ½À´Ï´Ù. ¸¸¾à join()ÀÌ ±× ¿¬¼Ó¿­ ÇüÀÇ ¸Þ½îµå¶ó¸é ±× ¿¬¼Ó¿­ ÇüÀº ±¸ºÐÀÚÀÇ Çü¿¡ µû¶ó¼­ ¾î¶² ÇüÀÇ ¹®ÀÚ¿­À» ¹ÝȯÇØ¾ß ÇÒÁö¸¦ °áÁ¤Çؾ߸¸ ÇÒ °ÍÀÔ´Ï´Ù.

ÀÌ·¯ÇÑ ÁÖÀåµé¿¡ ´ëÇÏ¿© ¸¸Á·ÇÏÁö ¸øÇϸé, ÇöÀç·Î´Â °è¼ÓÇÏ¿© string ¸ðµâ¿¡ ÀÖ´Â join() ÇÔ¼ö¸¦ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù, ÀÌ°ÍÀ¸·Î ´ÙÀ½°ú °°ÀÌ ÀÛ¼ºÇÒ ¼ö ÀÖ½À´Ï´Ù

    string.join([1, 2, 4, 8, 16], ", ")
¸ðµâÀº ½ÇÁ¦·Î ºÒÆòÇÏ°í ÀÖ´Â ±× ±¸¹®À» »ç¿ëÇؼ­ ¼±È£ÇÏ´Â ±¸¹®À» ±¸ÇöÇÑ´Ù´Â °ÍÀ» Àؾî¹ö¸®·Á°í ³ë·ÂÇØ¾ß ÇÒ °ÍÀÔ´Ï´Ù!


4.97. ¾î¶»°Ô ³ªÀÇ Äڵ尡 ÇÑ °´Ã¼ÀÇ À̸§À» ¾Ë¾Æ³¾ ¼ö ÀÖ½À´Ï±î?

ÀϹÝÀûÀ¸·Î ¸»Çؼ­, ±×·² ¼ö ¾ø½À´Ï´Ù, ¿Ö³ÄÇÏ¸é °´Ã¼´Â ½ÇÁ¦·Î´Â À̸§À» °¡ÁöÁö ¾Ê±â ¶§¹®ÀÔ´Ï´Ù. ÇÒ´ç ¼­¼ú¹®Àº ÇÒ´çµÈ °ªÀ» ±× À̸§¿¡ ÀúÀåÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó ±×°Í¿¡ ´ëÇÑ ÂüÁ¶Á¡À» ÀúÀåÇÕ´Ï´Ù. ÇʼöÀûÀ¸·Î, ÇÒ´çÀº °ª¿¡ ´ëÇÑ À̸§ÀÇ ¿«±â¸¦ »ý¼ºÇÕ´Ï´Ù. °°Àº Áø¸®°¡ def¿Í class ¼­¼ú¹®¿¡µµ Àû¿ëµË´Ï´Ù, ±×·¯³ª ±× °æ¿ì¿¡´Â ±× °ªÀÌ È£Ãâ°¡´ÉÇÕ´Ï´Ù. ´ÙÀ½ÀÇ Äڵ带 ¿¬±¸ÇØ º¸¼¼¿ä:

    class A:
        pass
    B = A
    a = B()
    b = a
    print b
    <__main__.A instance at 016D07CC>
    print a
    <__main__.A instance at 016D07CC>

ÀǵµÀûÀ¸·Î ÀÌ Å¬·¡½º´Â À̸§À» °¡Áý´Ï´Ù: µÎ °³ÀÇ À̸§¿¡ ¿«¿©Á® ÀÖ°í À̸§ B ¸¦ ÅëÇÏ¿© È£ÃâµÊ¿¡µµ ºÒ±¸ÇÏ°í, »ý¼ºµÈ ½Çü´Â ¿©ÀüÈ÷ Ŭ·¡½º AÀÇ ½Çü·Î º¸°í µÇ°í ÀÖ½À´Ï´Ù. ±×·¸Áö¸¸, ±× ½ÇüÀÇ À̸§ÀÌ a ÀÎÁö b ÀÎÁö´Â ¸»ÇÒ ¼ö Àִµ¥, µÎ À̸§ ¸ðµÎ °°Àº °ª¿¡ ¿«¿© Àֱ⠶§¹®ÀÔ´Ï´Ù.

ÀϹÝÀûÀ¸·Î À̾߱â Çؼ­ ¿©·¯ºÐÀÇ Äڵ尡 ƯÁ¤ÇÑ °ªÀÇ "À̸§À» ¾Ë¾Æ¾ß ÇÒ" ÇÊ¿ä´Â ¾ø½À´Ï´Ù. ÀǵµÀûÀ¸·Î ³»ºÎ¸¦ µé¿©´Ù º¸´Â ÇÁ·Î±×·¥À» ¸¸µé°í ÀÖÁö ¾Ê´Ù¸é, ÀÌ°ÍÀº º¸Åë Á¢±Ù¹ýÀ» ¹Ù²Ù¾î º¸´Â °ÍÀÌ À¯ÀÍÇÑ´Ù´Â °ÍÀ» ³ªÅ¸³» ÁÖ°í ÀÖ½À´Ï´Ù.


4.98. ¿Ö ºÎµ¿ ¼Ò¼öÁ¡¼ö °è»êÀº ±×·¸°Ô ºÎÁ¤È®ÇÑ°¡¿ä?

[8-Aug-2001: ÆÄÀ̽ã Áöµµ¼­ÀÇ °³¹ß ¹öÀüÀº ÀÌÁ¦ ºÎ·Ï¿¡ ´ÙÀ½°ú °°Àº ´õ ¸¹Àº Á¤º¸¸¦ Æ÷ÇÔÇÏ°í ÀÖ½À´Ï´Ù:
    http://python.sourceforge.net/devel-docs/tut/node14.html
]

»ç¶÷µéÀº °¡²û ´ÙÀ½°ú °°Àº °á°ú¿¡ ¸Å¿ì ³î¶ø´Ï´Ù:

 >>> 1.2-1.0
 0.199999999999999996
±×¸®°í ÆÄÀ̽ãÀÇ ¹ö±×¶ó°í »ý°¢ÇÕ´Ï´Ù. ±×·¸Áö ¾Ê½À´Ï´Ù. ±×°ÍÀº ºÎµ¿ ¼Ò¼öÁ¡¼öÀÇ ³»ºÎ Ç¥Çö ¶§¹®¿¡ ¾ß±âµÈ ¹®Á¦ÀÔ´Ï´Ù. ºÎµ¿ ¼Ò¼öÁ¡¼ö´Â °íÁ¤µÈ °³¼öÀÇ ÀÌÁø ÀÚ¸®¼ö·Î ÀúÀåµË´Ï´Ù.

10Áø¼ö¿¡¼­´Â, °íÁ¤µÈ °³¼öÀÇ ½ÊÁø ÀÚ¸®¼ö·Î Ç¥ÇöµÉ ¼ö ¾ø´Â ¼ýÀÚµéÀÌ ¸¹½À´Ï´Ù, Áï, 1/3 = 0.3333333333.......

ÀÌÁø ¼öÀÇ °æ¿ì¿¡´Â, 1/2 = 0.1, 1/4 = 0.01, 1/8 = 0.001, µîµî Ç¥ÇöµÉ ¼ö ¾ø´Â ¼ýÀÚµéÀÌ ¸¹½À´Ï´Ù. Áö¸®¼ö´Â ¾î¶² Á¡¿¡¼­ Àý´ÜµË´Ï´Ù.

ÆÄÀ̽ã 1.6 ÀÌÈÄ·Î, ºÎµ¿ ¼Ò¼öÁ¡ÀÇ repr() ÇÔ¼ö´Â ÀÓÀÇÀÇ ½Ç¼ö f¿¡ ´ëÇÏ¿© eval(repr(f)) == f¸¦ ÂüÀ¸·Î ¸¸µå´Âµ¥ ÇÊ¿äÇÑ ¸¸Å­ÀÇ ÀÚ¸®¼ö¸¦ Ãâ·ÂÇÕ´Ï´Ù. str() ÇÔ¼ö´Â ¾Æ¸¶µµ ¿øÇѹÙÀÇ ´õ¿í ÀÇ¹Ì ÀÖ´Â ¼ýÀÚ¸¦ Ãâ·ÂÇÕ´Ï´Ù:

 >>> 0.2
 0.20000000000000001
 >>> print 0.2
 0.2
¶Ç ´Ù½Ã, ÀÌ°ÍÀº ÆÄÀ̽ã°ú °ü·ÃÀÌ ¾ø½À´Ï´Ù, ±×·¯³ª C Ç÷§ÆûÀÌ ±âÀú¿¡¼­ ºÎµ¿¼Ò¼öÁ¡¼ö¸¦ ´Ù·ç´Â ¹æ½Ä°ú °ü·ÃÀÌ ÀÖÀ¸¸ç, ±Ã±ØÀûÀ¸·Î´Â °íÁ¤µÈ °³¼öÀÇ ¼öÄ¡ ¹®ÀÚ¿­À» ½á³¾ ¶§ Ç×»ó °¡Áö°Ô µÇ´Â ºÎÁ¤È®¼º°ú °ü·ÃÀÌ ÀÖ½À´Ï´Ù.

ÀÌ °á°úÁßÀÇ Çϳª´Â °è»êÀÇ °á°ú¸¦ ==À¸·Î ½Ç¼öÇü°ú ºñ±³ÇÏ´Â °ÍÀº À§ÇèÇÏ´Ù´Â °ÍÀÔ´Ï´Ù! ¾à°£¸¸ ºÎÁ¤È®Çصµ == ´Â ½ÇÆÐÇÑ´Ù´Â °ÍÀ» ÀǹÌÇÕ´Ï´Ù.

´ë½Å¿¡ ´ÙÀ½°ú °°Àº °ÍÀ» ½ÃµµÇØ º¸¼¼¿ä:

 epsilon = 0.0000000000001 # Tiny allowed error
 expected_result = 0.4
 if expected_result-epsilon <= computation() <= expected_result
+epsilon:
    ...


4.99. ¹öŬ¸® DB ÆÄÀÏÀ» ¿­¾î º¸·Á°í ÇßÁö¸¸, bsddb´Â bsddb.error¸¦ ¹ß»ý½Ãŵ´Ï´Ù: (22, 'Invalid argument'). µµ¿ÍÁÖ¼¼¿ä! ¾î¶»°Ô ÇØ¾ß ³ªÀÇ µ¥ÀÌŸ¸¦ º¹±¸ÇÒ ¼ö ÀÖÀ»±î¿ä?

´çȲÇÏÁö ¸¶¼¼¿ä! µ¥ÀÌŸ´Â ¾Æ¸¶µµ ±×´ë·ÎÀÏ °ÍÀÔ´Ï´Ù. ±× ¿¡·¯¿¡ ´ëÇÑ °¡Àå ÈçÇÑ ÀÌÀ¯´Â ÀÌÀüÀÇ ¹öŬ¸® DB ÆÄÀÏÀ» ÀÌÈÄÀÇ ¹öŬ¸® DB ¶óÀ̺귯¸® ¹öÀüÀ¸·Î ¿­·Á°í ½ÃµµÇÑ °ÍÀÔ´Ï´Ù.

¸¹Àº ¸®´ª½º ½Ã½ºÅÛÀº ÀÌÁ¦ ¼¼°³ÀÇ ¹öŬ¸® DB ¹öÀü ¸ðµÎ ÀÌ¿ë°¡´ÉÇÕ´Ï´Ù. ¸¸¾à ¹öÀü 1 ¿¡¼­ »õ·Î¿î ¹öÀüÀ¸·Î ¿Å±æ »ý°¢À̶ó¸é db_dump185¸¦ »ç¿ëÇÏ¿© ±× µ¥ÀÌŸ º£À̽ºÀÇ Æò¹® ÅؽºÆ® ¹öÀüÀ» ´ýÇÁÇϼ¼¿ä. ¸¸¾à ¹öÀü 2 ¿¡¼­ ¹öÀü 3À¸·Î À̵¿ÇÒ »ý°¢À̶ó¸é db2_dump¸¦ »ç¿ëÇÏ¿© ±× µ¥ÀÌŸ º£À̽ºÀÇ Æò¹® ÅؽºÆ® ¹öÀüÀ» »ý¼ºÇϼ¼¿ä. ¾î´À °æ¿ì¿¡³ª, db_load¸¦ »ç¿ëÇÏ¿© ÄÄÇ»ÅÍ¿¡ ¼³Ä¡µÈ ÃֽŠ¹öÀü¿ëÀ¸·Î °íÀ¯ÇÑ µ¥ÀÌŸº£À̽º¸¦ »õ·Ó°Ô »ý¼ºÇϼ¼¿ä. ¸¸¾à ¹öÀü 3 ÀÇ ¹öŬ¸® DB°¡ ¼³Ä¡µÇ¾î ÀÖ´Ù¸é, db2_load¸¦ »ç¿ëÇÏ¿© ¹öÀü 3¿ë °íÀ¯ÇÑ µ¥ÀÌŸº£À̽º¸¦ »ý¼ºÇÏ½Ç ¼ö ÀÖÀ» °ÍÀÔ´Ï´Ù.

Çؽ¬ ÆÄÀÏ Äڵ尡 µ¥ÀÌŸ¸¦ ¸Á°¡Æ®¸±¼ö ÀÖ´Ù°í ¾Ë·ÁÁø ¹ö±×¸¦ Æ÷ÇÔÇÏ°í Àֱ⠶§¹®¿¡ ¹öŬ¸® DB ¹öÀü 1 ÆÄÀϷκÎÅÍ À̵¿ÇÏ¼Å¾ß ÇÒ °ÍÀÔ´Ï´Ù.


4.100. ¾î¶² °ÍÀÌ ¸ðµâ¿¡¼­ import¸¦ »ç¿ëÇÏ´Â "°¡Àå ÁÁÀº °ü½À(best practices)"Àΰ¡¿ä?

¸ÕÀú, Ç¥ÁØ ¸ðµâÀº ÈǸ¢ÇÕ´Ï´Ù. ±×°ÍÀ» »ç¿ëÇϼ¼¿ä! Ç¥ÁØ ÆÄÀ̼± ¶óÀ̺귯¸®´Â °Å´ëÇÏ°í ´Ù¾çÇÕ´Ï´Ù. ¸ðµâÀ» »ç¿ëÇÏ¸é ½Ã°£°ú ³ë·ÂÀ» Àý°¨ÇÒ ¼ö ÀÖÀ¸¸ç ÄÚµåÀÇ À¯Áö º¸¼ö ºñ¿ëÀ» °¨¼Ò ½ÃÄÑ ÁÙ °ÍÀÔ´Ï´Ù. (´Ù¸¥ ¸¹Àº ÇÁ·Î±×·¥µéÀÌ Ç¥ÁØ ÆÄÀ̽㠸ðµâ¿¡ ÀÖ´Â ¹ö±×µéÀ» ¼öÁ¤ÇÏ°í Áö¿øÇϴµ¥ °øÇåÇÏ°í ÀÖ½À´Ï´Ù. Çù·ÂÀÚµéÀº ¶ÇÇÑ ¿©·¯ºÐÀÌ »ç¿ëÇÏ´Â ±× ¸ðµâµé¿¡ Àͼ÷Çϱ⠶§¹®¿¡, ¿©·¯ºÐÀÇ Äڵ带 ÀÌÇØÇϴµ¥ °É¸®´Â ½Ã°£ÀÇ ¾çÀ» °¨¼Ò½ÃÄÑ ÁÙ °ÍÀÔ´Ï´Ù.)

ÀÌ ´ë´äÀÇ ³ª¸ÓÁö´Â ´ëºÎºÐ °³ÀÎÀû ¼±È£µµÀÇ ¹®Á¦ÀÔ´Ï´Ù, ±×·¯³ª ¿©±â¿¡ ¾î¶² ´º½º±×·ìÀÇ ÇÊÀÚ°¡ ¸»ÇÑ °ÍÀÌ ÀÖ½À´Ï´Ù (ÀÀ´äÇØÁØ ¸ðµç ºÐ¿¡°Ô °¨»çµå¸³´Ï´Ù)

ÀϹÝÀûÀ¸·Î, ´ÙÀ½°ú °°ÀÌ »ç¿ëÇÏÁö ¸¶¼¼¿ä

 from modulename import *
±×·¸°Ô ÇÏ¸é ¼öÀÔÀÚÀÇ À̸§°ø°£ÀÌ ¾îÁö·´ÇôÁý´Ï´Ù. ¾î¶² »ç¶÷µéÀº ÀÌ·±¹æ½ÄÀ¸·Î ¼öÀԵǵµ·Ï µðÀÚÀÎµÈ ¸ðµâ¿¡¼­ Á¶Â÷ ÀÌ·± °ü¿ë¹ýÀ» ÇÇÇÕ´Ï´Ù. (ÀÌ·± ¹æ½ÄÀ¸·Î µðÀÚÀÎµÈ ¸ðµâ¿¡´Â Tkinter, thread, ±×¸®°í wxPythonÀÌ Æ÷ÇԵ˴ϴÙ.)

ÆÄÀÏÀÇ »ó´Ü¿¡ ¸ðµâµéÀ», ÇÑ ÁÙ¿¡ ÇÑ ¸ðµâ¾¿ ¼öÀÔÇϼ¼¿ä. ±×·¸°Ô Çϸé Äڵ尡 ¾î¶² ¸ðµâÀ» ÇÊ¿ä·Î ÇÏ´ÂÁö ¸íÈ®È÷ ÇÒ ¼ö ÀÖÀ¸¸ç ±× ¸ðµâÀÇ À̸§ÀÌ ¿µ¿ª¾È¿¡ Á¸ÀçÇÏ´ÂÁö ¾î¶²ÁöÀÇ ¹®Á¦¸¦ ÇÇÇÒ ¼ö ÀÖ½À´Ï´Ù.

¸¸¾à ¸¹Àº ¼öÀÔµéÀÌ ÀÖ°í, ±×¸®°í ±× ºñ¿ë ( ¸¹Àº ÃʱâÈ­ ½Ã°£)À» ÇÇÇÏ°íÀÚ ÇÑ´Ù¸é. ¼öÀÔµéÀ» (ÇÔ¼ö Á¤ÀÇÀÇ ÃÖ»ó´Ü°ú °°Àº) Áö¿ª ¿µ¿ª ¾ÈÀ¸·Î À̵¿½ÃÅ°¼¼¿ä. ÀÌ Å×Å©´ÐÀº ±× ÇÁ·Î±×·¥ÀÌ ¾î¶»°Ô ½ÇÇàµÇ´À³Ä¿¡ µû¶ó¼­ ¸¹Àº ¼öÀÔÀÌ ºÒÇÊ¿äÇÒ ¶§ ƯÈ÷ À¯¿ëÇÕ´Ï´Ù. ¸¸¾à ±× ¸ðµâÀÌ ´ÜÁö ±× ÇÔ¼ö¿¡¼­¸¸ »ç¿ëµÈ´Ù¸é ¼öÀÔÀ» ÇÔ¼ö ¾ÈÀ¸·Î À̵¿½ÃÅ°°í ½ÍÀ» ¼öµµ ÀÖ½À´Ï´Ù. (±× ¸ðµâÀ» ÃʱâÈ­ÇÏ´Â ½Ã°£ ¶§¹®¿¡) óÀ½À¸·Î ¸ðµâÀ» ÀûÀçÇÒ ¶§´Â ºñ½Ñ´ë°¡¸¦ Ä¡¸¦ ¼öµµ ÀÖ½À´Ï´Ù ±×·¯³ª ¸ðµâÀ» ¿©·¯¹ø ÀûÀçÇÏ´Â °ÍÀº ½ÇÁ¦ÀûÀ¸·Î ¹«·áÀÔ´Ï´Ù (¸¹Àº ¼öÀÇ »çÀü ÂüÁ¶). ±× ¸ðµâ À̸§ÀÌ ¿µ¿ª ¹ÛÀ¸·Î ³ª°¬À» Áö¶óµµ, ±× ¸ðµâÀº sys.modules¿¡¼­ »ç¿ë°¡´ÉÇÕ´Ï´Ù. ±×¸®ÇÏ¿©, ¸ðµâ ¼öÁØ¿¡ (ÇÊ¿äÇÏÁö ¾Ê´Ù¸é) ¼öÀÔÀ» ¹èÁ¤ÇÏÁö ¾Ê°í ÇÔ¼ö ¼öÁØ¿¡ ¸ðµç ¼öÀÔÀ» ¹èÁ¤Çصµ ½ÇÁ¦ÀûÀ¸·Î ¾Æ¹«·± ¹®Á¦°¡ ¾ø½À´Ï´Ù.

¾î¶² °æ¿ì¿¡´Â ÇʼöÀûÀ¸·Î ¼öÀÔÀ» ÇÔ¼ö ȤÀº Ŭ·¡½º·Î À̵¿½ÃÄѼ­ ¼øȯ ¼öÀÔÀÇ ¹®Á¦¸¦ ÇÇÇØ¾ß ÇÕ´Ï´Ù. °íµç(Gordon)Àº ´ÙÀ½°ú °°ÀÌ ¸»ÇÕ´Ï´Ù:

 ¼øȯ ¼öÀÔÀº µÎ ¸ðµâ ¸ðµÎ "import <module>" ÇüÅÂÀÇ ¼öÀÔÀ» »ç¿ëÇÏ´Â °÷¿¡¼­ ÈǸ¢ÇÕ´Ï´Ù. 
 ¼øȯ¼öÀÔÀº µÎ ¹ø° ¸ðµâÀÌ Ã¹ ¹ø° ¸ðµâ·ÎºÎÅÍ À̸§À» ¾òÀ¸·Á°í ÇÒ ¶§ ("from module import name") 
 ±×¸®°í ¼öÀÔÀÌ ÃÖ»óÀ§ ¼öÁØ¿¡ ÀÖÀ» ¶§ ½ÇÆÐÇÕ´Ï´Ù.
 ±×°ÍÀº ù ¹ø° ¸ðµâ¿¡ ÀÖ´Â À̸§µéÀÌ ¾ÆÁ÷ »ç¿ë°¡´ÉÇÏÁö ¾Ê±â ¶§¹®ÀÔ´Ï´Ù,
 (ù ¹ø° ¸ðµâÀº µÎ ¹ø° ¸ðµâÀ» ¼öÀÔÇÏ´À¶ó ¹Ù»Þ´Ï´Ù).
ÀÌ °æ¿ì¿¡, ¸¸¾à µÎ ¹ø° ¸ðµâÀÌ ¿ÀÁ÷ ÇϳªÀÇ ÇÔ¼ö¿¡¼­¸¸ »ç¿ëµÈ´Ù¸é, ¼öÀÔÀº ½±°Ô ±× ÇÔ¼ö¾ÈÀ¸·Î À̵¿µÉ ¼ö ÀÖ½À´Ï´Ù. ±× ¼öÀÔÀÌ È£ÃâµÉ ¶§ ±îÁö´Â, ù ¹ø° ¸ðµâÀº ÃʱâÈ­¸¦ ¿Ï°áÇÒ °ÍÀ̸ç, ±×¸®°í µÎ ¹ø° ¸ðµâÀº ¼öÀÔÀ» ÇÒ ¼ö ÀÖ½À´Ï´Ù.

¾î¶² ¸ðµâµéÀÌ Ç÷§Æû-Á¾¼ÓÀûÀ̶ó¸é ÃÖ»óÀ§ ¼öÁØÀÇ ÄÚµå·ÎºÎÅÍ ¼öÀÔÀ» À̵¿½Ãų ÇÊ¿ä°¡ ÀÖÀ»Áöµµ ¸ð¸¨´Ï´Ù. ±× °æ¿ì¿¡, ±× ÆÄÀÏÀÇ ÃÖ»óÀ§¿¡¼­ ¸ðµç ¸ðµâÀ» ¼öÀÔÇÏ´Â °ÍÁ¶Â÷µµ ºÒ°¡´ÉÇÒÁöµµ ¸ð¸¨´Ï´Ù. ÀÌ °æ¿ì¿¡´Â, Á¤È®ÇÑ ¸ðµâÀ» »óÀÀÇÏ´Â Ç÷§Æû-Á¾¼ÓÀû Äڵ忡¼­ ¼öÀÔÇÏ´Â °ÍÀÌ ÈǸ¢ÇÑ ¼±ÅÃÀÔ´Ï´Ù.

¸¸¾à ƯÁ¤ Ŭ·¡½ºÀÇ ½Çüµé¸¸ÀÌ ¸ðµâÀ» »ç¿ëÇÑ´Ù¸é, ¸ðµâÀ» ±× Ŭ·¡½ºÀÇ __init__ ¸Þ½îµå¿¡¼­ ¼öÀÔÇÏ°í ±× ¸ðµâÀ» ½Çü º¯¼ö¿¡ ÇÒ´çÇÏ¿©¼­ ±× °´Ã¼°¡ »ì¾Æ ÀÖ´Â µ¿¾È¿¡ Ç×»ó (±× ½Çü º¯¼ö¸¦ ÅëÇÏ¿©) »ç¿ë°¡´ÉÇϵµ·Ï ÇÏ´Â °ÍÀÌ Çö¸íÇÕ´Ï´Ù. ÁÖ¸ñÇÒ °ÍÀº ±× Ŭ·¡½º°¡ ½Çüȭ µÉ ¶§±îÁö ¼öÀÔÀ» ¿¬±âÇÏ·Á¸é, ±× ¼öÀÔÀº ¹Ýµå½Ã ¸Þ½îµå ¾È¿¡ ÀÖ¾î¾ß ÇÑ´Ù´Â °ÍÀÔ´Ï´Ù. ¼öÀÔÀ» ±× Ŭ·¡½º ¾ÈÀ̱â´Â ÇÏÁö¸¸ ¸Þ½îµåÀÇ ¹Û¿¡ ¹èÁ¤ÇÏ´Â °ÍÀº ±× ¸ðµâÀÌ ÃʱâÈ­ µÉ ¶§ ¿©ÀüÈ÷ ±× ¼öÀÔÀÌ ÀϾµµ·Ï ¾ß±âÇÕ´Ï´Ù.


4.101. ¹ö±×¸¦ ã¾Æ³»°Å³ª Á¤ÀûÀÎ ºÐ¼®À» µµ¿ÍÁÖ´Â µµ±¸°¡ ÀÖ³ª¿ä?

³×. PyChecker´Â Á¤Àû ºÐ¼® µµ±¸·Î¼­ ÆÄÀ̽㠼ҽºÄڵ忡 ÀÖ´Â ¹ö±×¸¦ ã¾Æ³¾ »Ó¸¸ ¾Æ´Ï¶ó ÄÚµåÀÇ º¹À⼺°ú ½ºÅ¸ÀÏ¿¡ °üÇؼ­µµ °æ°íÇØ ÁÝ´Ï´Ù.

PyChecker´Â ´ÙÀ½¿¡¼­ : http://pychecker.sf.net/ ¾òÀ» ¼ö ÀÖ½À´Ï´Ù.


4.102. UnicodeError: ASCII decoding error: ordinal not in range(128) *

ÀÌ ¿¡·¯´Â ¼³Ä¡µÈ ÆÄÀ̽ãÀÌ ¿ÀÁ÷ 7-ºñÆ® ¾Æ½ºÅ° Äڵ常À» ´Ù·ê ¼ö ÀÖ´Ù´Â °ÍÀ» ³ªÅ¸³À´Ï´Ù. °ÆÁ¤ÇÏÁö ¸¶¼¼¿ä, ½±°Ô °íÄ¥ ¼ö ÀÖÀ¸¸ç ½±°Ô ÆÄÀ̽ãÀÌ Á¤ 8-ºñÆ® ÄÚµåÀüȯÀ» »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù.

ÀÌ ¹®Á¦¸¦ ÇØ°áÇÏ´Â °¡Àå °£°áÇÑ ¹æ¹ýÀº site.py¸¦ ÆíÁýÇÏ´Â °ÍÀÔ´Ï´Ù. °Å±â, ¸¶Áö¸· ºÎºÐ¿¡¼­, ´ÙÀ½°ú °°Àº ¶óÀÎÀ» ¹ß°ßÇÒ °ÍÀÔ´Ï´Ù

    encoding = "ascii"
"ascii"¸¦ ¿©·¯ºÐÀÌ ¿øÇÏ´Â ÄÚµåÀüȯÀ¸·Î º¯°æÇϼ¼¿ä. ÁÖÀDZí°Ô site.py ¸ðµâ¿¡ ÀÖ´Â ´ÙÀ½ÀÇ ¶óÀÎÀ» ÀÐ¾î º¸½Ã¸é, °Å±â¿¡¼­ "if 0:"À¸·Î ÁÖ¼®Ã³¸®µÈ ¶óÀεéÀ» ¹ß°ßÇÒ ¼ö ÀÖÀ» °ÍÀÔ´Ï´Ù. ÀÌ ¶óÀÎÀÇ ÁÖ¼®À» Á¦°ÅÇϽøé ÆÄÀ̽ãÀº ÇöÀçÀÇ ·ÎÄÉÀÏ ¼³Á¤°ªÀ» (LC_CTYPE ȯ°æ º¯¼ö, ¶Ç´Â LANG/LC_ALL) »ç¿ëÇÏ¿© ¼±È£ÇÏ´Â ÄÚµå ÀüȯÀ» °áÁ¤ÇÒ °ÍÀÔ´Ï´Ù.

±×¸®°í ¸¶Áö¸·À¸·Î, sitecustomize.py¸¦ ¸¸µé ¼ö Àִµ¥, ¿©·¯ºÐÀÌ ¿øÇÏ´Â ¹æ½ÄÀ¸·Î ÄÚµåÀüȯÀ» ¼³Á¤ÇØ ÁÙ °ÍÀÔ´Ï´Ù. ³ª´Â ±×·¯ÇÑ ¶óÀÎÀÌ ÁÖ¼®Á¦°ÅµÇ¾î ¼öÁ¤µÈ site.py ¹öÀüÀ» »ç¿ëÇÕ´Ï´Ù.

    # Set the string encoding used by the Unicode implementation.
    # The default is 'ascii'
    encoding = "ascii" # <= CHANGE THIS if you wish
    # Enable to support locale aware default string encodings.
    import locale
    loc = locale.getdefaultlocale()
    if loc[1]:
        encoding = loc[1]
    if encoding != "ascii":
        import sys
        sys.setdefaultencoding(encoding)

¶ÇÇÑ À©µµ¿ì¿¡¼­ ÁÖÀÇÇÒ °ÍÀº, "mbcs"¶ó°í ¾Ë·ÁÁø ÄÚµåÀüȯÀÌ Àִµ¥, ÇöÀçÀÇ ·ÎÄÉÀÏ¿¡ Á¾¼ÓÀûÀÎ ÄÚµå ÀüȯÀ» »ç¿ëÇÕ´Ï´Ù. ¸¹Àº °æ¿ì¿¡, ƯÈ÷ COM°ú ÀÛµ¿ÇÒ ¶§´Â, ÀÌ°ÍÀÌ ¾Æ¸¶µµ »ç¿ëÇؾßÇÒ ÀûÀýÇÑ ±âº» ÄÚµåÀüȯÀÌ µÉ °ÍÀÔ´Ï´Ù.


¾ÕÀ¸·Î    ¸ñÂ÷    1    2    3    Á¦4Àå    5    6    7    8    ´ÙÀ½À¸·Î