6. 모ë¶
íì´ì¬ ì¸í°í리í°ë¥¼ ì¢ ë£í íì ë¤ì ë¤ì´ê°ë©´, ì¬ë¬ë¶ì´ ë§ë¤ìë ì ìë¤ì´ ì¬ë¼ì§ëë¤ (í¨ìë ë³ìë¤). ê·¸ëì, ì¢ ê¸´ íë¡ê·¸ë¨ì ì°ê³ ì íë¤ë©´, ëì ì¸í°íë¦¬í° ì ë ¥ì í¸ì§ê¸°ë¥¼ ì¬ì©í´ì ì¤ë¹í íì ê·¸ íì¼ì ì ë ¥ì¼ë¡ ì¬ì©í´ì ì¤ííë ê²ì´ ì¢ìµëë¤. ì´ë ê² íë ê²ì ì¤í¬ë¦½í¸ 를 ë§ë ë¤ê³ í©ëë¤. íë¡ê·¸ë¨ì´ 길ì´ì§ì ë°ë¼, ì ì§ë¥¼ ì½ê² íë ¤ê³ ì¬ë¬ ê°ì íì¼ë¡ ëëê³ ì¶ì ì ììµëë¤. ì¬ë¬ íë¡ê·¸ë¨ìì ì¼ë í¸ë¦¬í í¨ì를 ê° íë¡ê·¸ë¨ì ì ì를 ë³µì¬íì§ ìê³ ë ì¬ì©íê³ ì¶ì ìë ììµëë¤.
ì´ë° ê²ì ì§ìí기 ìí´, íì´ì¬ì ì ìë¤ì íì¼ì ë£ê³ ì¤í¬ë¦½í¸ë ì¸í°í리í°ì ëíí 모ëìì ì¬ì©í ì ìë ë°©ë²ì ì ê³µí©ëë¤. ê·¸ë° íì¼ì 모ë ì´ë¼ê³ ë¶ë¦ ëë¤; 모ëë¡ë¶í° ì ìë¤ì´ ë¤ë¥¸ 모ëì´ë ë©ì¸ 모ëë¡ ìí¬í¸ ë ì ììµëë¤ (ë©ì¸ 모ëì ìµìì ìì¤ìì ì¤íëë ì¤í¬ë¦½í¸ë ê³ì°ê¸° 모ëìì ì¡ì¸ì¤íë ë³ìë¤ì 컬ë ì ì ëë¤).
모ëì íì´ì¬ ì ìì 문ì¥ë¤ì ë´ê³ ìë íì¼ì
ëë¤. íì¼ì ì´ë¦ì 모ë ì´ë¦ì íì¥ì .py 를 ë¶ì
ëë¤. 모ë ë´ìì, 모ëì ì´ë¦ì ì ì ë³ì __name__ ì¼ë¡ ì ê³µë©ëë¤. ì를 ë¤ì´, ì¬ë¬ë¶ì´ ì¢ìíë í¸ì§ê¸°ë¡ fibo.py ë¼ë ì´ë¦ì íì¼ì íì¬ ëë í°ë¦¬ì ë§ë¤ê³ ë¤ìê³¼ ê°ì ë´ì©ì¼ë¡ ì±ìëë¤:
# Fibonacci numbers module
def fib(n):
"""Write Fibonacci series up to n."""
a, b = 0, 1
while a < n:
print(a, end=' ')
a, b = b, a+b
print()
def fib2(n):
"""Return Fibonacci series up to n."""
result = []
a, b = 0, 1
while a < n:
result.append(a)
a, b = b, a+b
return result
ì´ì íì´ì¬ ì¸í°í리í°ì ë¤ì´ê°ì ì´ ëª¨ëì ë¤ìê³¼ ê°ì ëª ë ¹ì¼ë¡ ìí¬í¸ í©ëë¤:
>>> import fibo
ì´ë ê² íë¤ê³ fibo ì ì ìë í¨ìë¤ì ì´ë¦ì íì¬ ì´ë¦ ê³µê°ì ì§ì ì¶ê°íì§ë ììµëë¤ (ìì¸í ë´ì©ì íì´ì¬ ì¤ì½íì ì´ë¦ ê³µê°ë¥¼ 참조íì¸ì); ì¤ì§ 모ë ì´ë¦ fibo ë§ ì¶ê°í ë¿ì
ëë¤. ì´ ëª¨ë ì´ë¦ì ì¬ì©í´ì í¨ìë¤ì ì¡ì¸ì¤í ì ììµëë¤:
>>> fibo.fib(1000)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
>>> fibo.fib2(100)
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
>>> fibo.__name__
'fibo'
í¨ì를 ì주 ì¬ì©í ê±°ë¼ë©´ ì§ì ì´ë¦ì¼ë¡ ëì í ì ììµëë¤:
>>> fib = fibo.fib
>>> fib(500)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377
6.1. 모ë ë 보기¶
모ëì í¨ì ì ìë¿ë§ ìëë¼ ì¤í ê°ë¥í 문ì¥ë¤ë í¬í¨í ì ììµëë¤. ì´ ë¬¸ì¥ë¤ì 모ëì ì´ê¸°ííë ë° ì¬ì©ë©ëë¤. ì´ê²ë¤ì ìí¬í¸ 문ìì 모ë ì´ë¦ì´ ì²ì ë±ì¥í ëë§ ì¤íë©ëë¤. [1] (ì´ê²ë¤ì íì¼ì´ ì¤í¬ë¦½í¸ë¡ ì¤íë ëë ì¤íë©ëë¤.)
ê° ëª¨ëì ìì ë§ì ì´ë¦ ê³µê°ì ê°ê³ ìëë°, ê·¸ 모ëìì ì ìë í¨ìë¤ì ì ì ì´ë¦ ê³µê°ì¼ë¡ ì¬ì©ë©ëë¤. ê·¸ëì, 모ëì ì ìë ì¬ì©ìì ì ì ë³ìì ì°ì°í ì¶©ëí ê²ì ê±±ì íì§ ìê³ ì ì ë³ì를 ì¬ì©í ì ììµëë¤. ë°ë©´ì, ì¬ë¬ë¶ì´ ë¬´ì¼ íëì§ ìë¤ë©´, 모ëì í¨ì를 참조íëë° ì¬ì©ë ê²ê³¼ ê°ì í기ë²ì¼ë¡ 모ëì ì ì ë³ìë¤ì ê±´ë릴 ì ììµëë¤, modname.itemname.
모ëì ë¤ë¥¸ 모ëë¤ì ìí¬í¸í ì ììµëë¤. 모ë import 문ë¤ì 모ëì ì²ìì ëë ê²ì´ ê´ë¡ì§ë§ ë°ëì ê·¸ëì¼ íë ê²ì ìëëë¤ (ê·¸ ì ì ê´í í ì¤í¬ë¦½í¸ë ë§ì°¬ê°ì§ëë¤). ìí¬í¸ëë 모ë ì´ë¦ì, 모ëì ìµìì ìì¤(í¨ìë í´ëì¤ì ë°ê¹¥)ì ë°°ì¹ëë©´, ìí¬í¸íë 모ëì ì ì ì´ë¦ ê³µê°ì ì¶ê°ë©ëë¤.
모ëì ë¤ì´ìë ì´ë¦ë¤ì ì§ì ìí¬í¸íë 모ëì ì´ë¦ ê³µê°ì¼ë¡ ìí¬í¸íë import 문ì ë³ì¢
ì´ ììµëë¤. ì를 ë¤ì´:
>>> from fibo import fib, fib2
>>> fib(500)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377
ì´ê²ì ì§ì ì´ë¦ ê³µê°ì ìí¬í¸ëë 모ëì ì´ë¦ì ë§ë¤ì§ ììµëë¤ (ê·¸ëì ì´ ìììë, fibo ê° ì ìëì§ ììµëë¤).
모ëì´ ì ìíë 모ë ì´ë¦ì ìí¬í¸íë ë³ì¢ ë ììµëë¤:
>>> from fibo import *
>>> fib(500)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377
ì´ê²ì ë°ì¤ (_) ë¡ ììíë ê²ë¤ì ì ì¸í 모ë ì´ë¦ì ìí¬í¸ í©ëë¤. ëë¶ë¶ íì´ì¬ íë¡ê·¸ë머ë¤ì ì´ ê¸°ë¥ì ì¬ì©íì§ ìëë°, ì¸í°í리í°ë¡ ìë ¤ì§ì§ ìì ì´ë¦ë¤ì ì§í©ì ëì
íê² ëì´, ì¬ë¬ë¶ì´ ì´ë¯¸ ì ìí ê²ë¤ì ê°ë¦¬ê² ë ì ì기 ë문ì
ëë¤.
ì¼ë°ì ì¼ë¡ 모ëì´ë í¨í¤ì§ìì * 를 ìí¬í¸íë ê²ì ëì´ì ì°í¸ë¦¬ê² íë¤ë ê²ì ì ìíì¸ì, ì¢
ì¢
ì½ê¸°ì í¸íì§ ìì ì½ë를 ë§ë¤ê¸° ë문ì
ëë¤. íì§ë§, ëíí ì¸ì
ìì ì
ë ¥ì ì¤ì´ê³ ì ì¬ì©íë ê²ì ìê´ììµëë¤.
모ë ì´ë¦ ë¤ìì as ê° ì¬ ê²½ì°, as ë¤ìì ì´ë¦ì ìí¬í¸í 모ëì ì§ì ì°ê²°í©ëë¤.
>>> import fibo as fib
>>> fib.fib(500)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377
ì´ê²ì import fibo ê°íë ê²ê³¼ ê°ì ë°©ìì¼ë¡ 모ëì ìí¬í¸ íëë°, ì ì¼í ì°¨ì´ì ì ê·¸ 모ëì fib ë¼ë ì´ë¦ì¼ë¡ ì¬ì©í ì ìë¤ë ê²ì
ëë¤.
fromì ì¨ì ë¹ì·í í¨ê³¼ë¥¼ ë¼ ëë ì¬ì©í ì ììµëë¤:
>>> from fibo import fib as fibonacci
>>> fibonacci(500)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377
ì°¸ê³
í¨ì¨ì±ì ì´ì ë¡, ê° ëª¨ëì ì¸í°íë¦¬í° ì¸ì
ë§ë¤ í ë²ë§ ìí¬í¸ë©ëë¤. ê·¸ëì, ì¬ë¬ë¶ì´ 모ëì ìì íë©´, ì¸í°í리í°ë¥¼ ë¤ì ìììì¼ì¼ í©ëë¤ â ëë, ëííì¼ë¡ ìííë 모ëì´ íëë¿ì´ë¼ë©´, importlib.reload() 를 ì¬ì©íì¸ì. ì를 ë¤ì´, import importlib; importlib.reload(modulename).
6.1.1. 모ëì ì¤í¬ë¦½í¸ë¡ ì¤íí기¶
ì¬ë¬ë¶ì´ íì´ì¬ 모ëì ì´ë ê² ì¤ííë©´
python fibo.py <arguments>
모ëì ìë ì½ëë, ê·¸ê²ì ìí¬í¸í ëì²ë¼ ì¤íë©ëë¤. íì§ë§ __name__ ì "__main__" ë¡ ì¤ì ë©ëë¤. ì´ê²ì, ì´ ì½ë를 모ëì ëì ë¶ì¬ì:
if __name__ == "__main__":
import sys
fib(int(sys.argv[1]))
íì¼ì ìí¬í¸í ì ìë 모ëë¿ë§ ìëë¼ ì¤í¬ë¦½í¸ë¡ë ì¬ì©í ì ìëë¡ ë§ë¤ ì ììì ì미íëë°, ì¤ì§ 모ëì´ âë©ì¸â íì¼ë¡ ì¤íë ëë§ ëª ë ¹íì íì±íë ì½ëê° ì¤íë기 ë문ì ëë¤:
$ python fibo.py 50
0 1 1 2 3 5 8 13 21 34
모ëì´ ìí¬í¸ë ë, ì½ëë ì¤íëì§ ììµëë¤:
>>> import fibo
>>>
ì´ê²ì ì¢ ì¢ ëª¨ëì ëí í¸ë¦¬í ì¬ì©ì ì¸í°íì´ì¤ë¥¼ ì ê³µíê±°ë í ì¤í¸ 목ì ì¼ë¡ ì¬ì©ë©ëë¤ (모ëì ì¤í¬ë¦½í¸ë¡ ì¤ííë©´ í ì¤í¸ ì¤ìí¸ë¥¼ ì¤íí기).
6.1.2. 모ë ê²ì ê²½ë¡Â¶
spam ì´ë¼ë ì´ë¦ì 모ëì´ ìí¬í¸ë ë, ì¸í°í리í°ë 먼ì ê·¸ ì´ë¦ì ë´ì¥ 모ëì ì°¾ìµëë¤. ì´ ëª¨ë ì´ë¦ë¤ì sys.builtin_module_namesì ëì´ë©ëë¤. ë°ê²¬ëì§ ìì¼ë©´, ë³ì sys.path ë¡ ì£¼ì´ì§ë ëë í°ë¦¬ë¤ìì spam.py ë¼ë ì´ë¦ì íì¼ì ì°¾ìµëë¤. sys.path ë ì´ ìì¹ë¤ë¡ ì´ê¸°íë©ëë¤:
ì ë ¥ ì¤í¬ë¦½í¸ë¥¼ í¬í¨íë ëë í°ë¦¬ (ëë íì¼ì´ ì§ì ëì§ ììì ëë íì¬ ëë í°ë¦¬).
PYTHONPATH(ëë í°ë¦¬ ì´ë¦ë¤ì 목ë¡, ì ¸ ë³ìPATHì ê°ì 문ë²).ì¤ì¹ ìì¡´ì ì¸ ê¸°ë³¸ê° (ê´ë¡ì ë°ë¼
site-packagesëë í°ë¦¬ë¥¼ í¬í¨í©ëë¤,site모ëì´ ì²ë¦¬í©ëë¤).
ìì¸í ë´ì©ì The initialization of the sys.path module search pathìì íì¸í ì ììµëë¤.
ì°¸ê³
ì¬ë³¼ë¦ ë§í¬ë¥¼ ì§ìíë íì¼ ìì¤í ìì, ì ë ¥ ì¤í¬ë¦½í¸ë¥¼ í¬í¨íë ëë í°ë¦¬ë ì¬ë³¼ë¦ ë§í¬ë¥¼ ë³íí íì ê³ì°ë©ëë¤. ë¤ë¥¸ ë§ë¡, ì¬ë³¼ë¦ ë§í¬ë¥¼ í¬í¨íë ëë í°ë¦¬ë 모ë ê²ì ê²½ë¡ì í¬í¨ëì§ ììµëë¤.
ì´ê¸°í íì, íì´ì¬ íë¡ê·¸ë¨ì sys.path 를 ìì í ì ììµëë¤. ì¤í¬ë¦½í¸ë¥¼ í¬í¨íë ëë í°ë¦¬ë ê²ì ê²½ë¡ì ì²ìì, íì¤ ë¼ì´ë¸ë¬ë¦¬ ê²½ë¡ì ìì ëì
ëë¤. ì´ê²ì ê°ì ì´ë¦ì¼ ê²½ì° ë¼ì´ë¸ë¬ë¦¬ ëë í°ë¦¬ì ìë ê² ëì ì¤í¬ë¦½í¸ë¥¼ í¬í¨íë ëë í°ë¦¬ì ê²ì´ ë¡ëëë¤ë ë»ì
ëë¤. ì´ ì¹íì´ ìëë ê²ì´ ìëë¼ë©´ ìë¬ì
ëë¤. ë ìì¸í ì ë³´ë íì¤ ëª¨ëë¤ ì ë³´ì¸ì.
6.1.3. âì»´íì¼ëâ íì´ì¬ íì¼Â¶
모ë ë¡ë©ì ë¹ ë¥´ê² íë ¤ê³ , íì´ì¬ì __pycache__ ëë í°ë¦¬ì ê° ëª¨ëì ì»´íì¼ë ë²ì ì module.version.pyc ë¼ë ì´ë¦ì¼ë¡ ìºì±í©ëë¤. version ì ì»´íì¼ë íì¼ì íìì ì§ì í©ëë¤; ì¼ë°ì ì¼ë¡ íì´ì¬ì ë²ì ë²í¸ë¥¼ í¬í¨í©ëë¤. ì를 ë¤ì´, CPython ë°°í¬ 3.3 ìì spam.py ì ì»´íì¼ë ë²ì ì __pycache__/spam.cpython-33.pyc ë¡ ìºì± ë©ëë¤. ì´ ëª
ëª
ë²ì ìë¡ ë¤ë¥¸ íì´ì¬ ë°°í¬ì ë²ì ì ì»´íì¼ë 모ëë¤ì´ 공존í ì ìëë¡ í©ëë¤.
íì´ì¬ì ìì¤ì ìì ìê°ì ì»´íì¼ë ë²ì ê³¼ ë¹êµí´ì ìí¨ê° ì§ë ë¤ì ì»´íì¼í´ì¼ íëì§ ê²ì¬í©ëë¤. ì´ê²ì ìì í ìëíë ê³¼ì ì ëë¤. ëí, ì»´íì¼ë 모ëì íë«í¼ ë 립ì ì´ê¸° ë문ì, ê°ì ë¼ì´ë¸ë¬ë¦¬ë¥¼ ìë¡ ë¤ë¥¸ ìí¤í ì²ë¥¼ ê°ë ìì¤í ë¤ìì ê³µì í ì ììµëë¤.
íì´ì¬ì ë ê°ì§ ìí©ìì ìºì를 ê²ì¬íì§ ììµëë¤. 첫째ë¡, ëª ë ¹íìì ì§ì ë¡ëëë 모ëë¤ì íì ì¬ì»´íì¼íê³ ê·¸ 결과를 ì ì¥íì§ ììµëë¤. ë째ë¡, ìì¤ ëª¨ëì´ ìì¼ë©´ ìºì를 ê²ì¬íì§ ììµëë¤. ìì¤ ìë (ì»´íì¼ë íì¼ë§ ìë) ë°°í¬ë¥¼ ì§ìíë ¤ë©´, ì»´íì¼ë 모ëì´ ìì¤ ëë í°ë¦¬ì ìì´ì¼ íê³ , ìì¤ ëª¨ëì´ ìì´ì¼ í©ëë¤.
ì 문ê°ë¥¼ ìí ëª ê°ì§ í
ì»´íì¼ë 모ëì í¬ê¸°ë¥¼ ì¤ì´ë ¤ë©´ íì´ì¬ ëª ë ¹ì
-Oë-OOì¤ìì¹ë¥¼ ì¬ì©í ì ììµëë¤.-Oì¤ìì¹ë assert 문ì ì ê±°íê³ ,-OOì¤ìì¹ë assert 문과 __doc__ 문ìì´ì 모ë ì ê±°í©ëë¤. ì´ë¤ íë¡ê·¸ë¨ë¤ì ì´ê²ë¤ì ìì¡´í기 ë문ì, 무ìì íê³ ìëì§ ìë ê²½ì°ë§ ì´ ìµì ì ì¬ì©í´ì¼ í©ëë¤. âìµì íëâ 모ëìopt-í그를 ê°ê³ , ë³´íµ ë ììµëë¤. 미ëì ë°°í¬ììë ìµì íì í¨ê³¼ê° ë³ê²½ë ì ììµëë¤..pyíì¼ìì ì½ì ëë³´ë¤.pycíì¼ìì ì½ì ë íë¡ê·¸ë¨ì´ ë 빨리 ì¤íëì§ë ììµëë¤;.pycíì¼ìì ë 빨ë¼ì§ë ê²ì ë¡ëëë ìëë¿ì ëë¤.모ë
compileallì ëë í°ë¦¬ì ìë 모ë 모ëì .pyc íì¼ë¤ì ë§ë¤ ì ììµëë¤.ì´ ì ì°¨ì ëí ë ìì¸í ì ë³´, ê²°ì ë¤ì ììë를 í¬í¨í©ëë¤, ë PEP 3147 ì ëìµëë¤.
6.2. íì¤ ëª¨ëë¤Â¶
íì´ì¬ì íì¤ ëª¨ëë¤ì ë¼ì´ë¸ë¬ë¦¬ê° í¨ê» ì¤ëë°, ë³ëì 문ì íì´ì¬ ë¼ì´ë¸ë¬ë¦¬ ë í¼ë°ì¤ (ì´íë¡ë âë¼ì´ë¸ë¬ë¦¬ ë í¼ë°ì¤â) ìì ì¤ëª
í©ëë¤. ì´ë¤ 모ëë¤ì ì¸í°í리í°ì ë´ì¥ë©ëë¤; ì´ê²ë¤ì ì¸ì´ì íµì¬ì ì¸ ë¶ë¶ì ìëì§ë§ ê·¸ë°ë°ë ë´ì¥ë ì°ì°ë¤ì ëí ì¡ì¸ì¤ë¥¼ ì ê³µíëë°, í¨ì¨ì´ë ìì¤í
í¸ì¶ê³¼ ê°ì ì´ì ì²´ì 기본 ììë¤ì ëí ì¡ì¸ì¤ë¥¼ ì ê³µí기 ìí¨ì
ëë¤. ê·¸ë° ëª¨ëë¤ì ì§í©ì ì¤ì ìµì
ì¸ë° ê¸°ë° íë«í¼ ìì¡´ì ì
ëë¤. ì를 ë¤ì´, winreg 모ëì ìëì° ìì¤í
ììë§ ì ê³µë©ëë¤. í¹ë³í 모ë íëë 주목ì ë°ì íìê° ììµëë¤: sys. 모ë íì´ì¬ ì¸í°í리í°ì ë´ì¥ë©ëë¤. ë³ì sys.ps1 ì sys.ps2 ë 기본과 ë³´ì¡° í롬íí¸ë¡ ì¬ì©ëë 문ìì´ì ì ìí©ëë¤:
>>> import sys
>>> sys.ps1
'>>> '
>>> sys.ps2
'... '
>>> sys.ps1 = 'C> '
C> print('Yuck!')
Yuck!
C>
ì´ ë ê°ì ë³ìë¤ì ì¸í°í리í°ê° ëíí 모ëì¼ ëë§ ì ìë©ëë¤.
ë³ì sys.path ë ì¸í°í리í°ì 모ë ê²ì ê²½ë¡ë¥¼ ê²°ì íë 문ìì´ë¤ì 리ì¤í¸ì
ëë¤. íê²½ ë³ì PYTHONPATH ìì ì·¨í 기본 ê²½ë¡ë, PYTHONPATH ê° ì¤ì ëì§ ìë ê²½ì° ë´ì¥ 기본ê°ì¼ë¡ ì´ê¸°íë©ëë¤. íì¤ ë¦¬ì¤í¸ ì°ì°ì ì¬ì©í´ì ìì í ì ììµëë¤:
>>> import sys
>>> sys.path.append('/ufs/guido/lib/python')
6.3. dir() í¨ì¶
ë´ì¥ í¨ì dir() ì 모ëì´ ì ìíë ì´ë¦ë¤ì ì°¾ë ë° ì¬ì©ë©ëë¤. 문ìì´ë¤ì ì ë ¬ë 리ì¤í¸ë¥¼ ëë ¤ì¤ëë¤:
>>> import fibo, sys
>>> dir(fibo)
['__name__', 'fib', 'fib2']
>>> dir(sys)
['__breakpointhook__', '__displayhook__', '__doc__', '__excepthook__',
'__interactivehook__', '__loader__', '__name__', '__package__', '__spec__',
'__stderr__', '__stdin__', '__stdout__', '__unraisablehook__',
'_clear_type_cache', '_current_frames', '_debugmallocstats', '_framework',
'_getframe', '_git', '_home', '_xoptions', 'abiflags', 'addaudithook',
'api_version', 'argv', 'audit', 'base_exec_prefix', 'base_prefix',
'breakpointhook', 'builtin_module_names', 'byteorder', 'call_tracing',
'callstats', 'copyright', 'displayhook', 'dont_write_bytecode', 'exc_info',
'excepthook', 'exec_prefix', 'executable', 'exit', 'flags', 'float_info',
'float_repr_style', 'get_asyncgen_hooks', 'get_coroutine_origin_tracking_depth',
'getallocatedblocks', 'getdefaultencoding', 'getdlopenflags',
'getfilesystemencodeerrors', 'getfilesystemencoding', 'getprofile',
'getrecursionlimit', 'getrefcount', 'getsizeof', 'getswitchinterval',
'gettrace', 'hash_info', 'hexversion', 'implementation', 'int_info',
'intern', 'is_finalizing', 'last_traceback', 'last_type', 'last_value',
'maxsize', 'maxunicode', 'meta_path', 'modules', 'path', 'path_hooks',
'path_importer_cache', 'platform', 'prefix', 'ps1', 'ps2', 'pycache_prefix',
'set_asyncgen_hooks', 'set_coroutine_origin_tracking_depth', 'setdlopenflags',
'setprofile', 'setrecursionlimit', 'setswitchinterval', 'settrace', 'stderr',
'stdin', 'stdout', 'thread_info', 'unraisablehook', 'version', 'version_info',
'warnoptions']
ì¸ìê° ìì¼ë©´, dir() ë íì¬ ì ìí ì´ë¦ë¤ì ëì´í©ëë¤:
>>> a = [1, 2, 3, 4, 5]
>>> import fibo
>>> fib = fibo.fib
>>> dir()
['__builtins__', '__name__', 'a', 'fib', 'fibo', 'sys']
모ë íì ì´ë¦ì ëì´íë¤ë ê²ì ì ìí´ì¼ í©ëë¤: ë³ì, 모ë, í¨ì, ë±ë±.
dir() ì ë´ì¥ í¨ìì ë³ìë¤ì ì´ë¦ì ëì´íì§ ììµëë¤. ê·¸ê²ë¤ì 목ë¡ì ìíë¤ë©´, íì¤ ëª¨ë builtins ì ì ìëì´ ììµëë¤:
>>> import builtins
>>> dir(builtins)
['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException',
'BlockingIOError', 'BrokenPipeError', 'BufferError', 'BytesWarning',
'ChildProcessError', 'ConnectionAbortedError', 'ConnectionError',
'ConnectionRefusedError', 'ConnectionResetError', 'DeprecationWarning',
'EOFError', 'Ellipsis', 'EnvironmentError', 'Exception', 'False',
'FileExistsError', 'FileNotFoundError', 'FloatingPointError',
'FutureWarning', 'GeneratorExit', 'IOError', 'ImportError',
'ImportWarning', 'IndentationError', 'IndexError', 'InterruptedError',
'IsADirectoryError', 'KeyError', 'KeyboardInterrupt', 'LookupError',
'MemoryError', 'NameError', 'None', 'NotADirectoryError', 'NotImplemented',
'NotImplementedError', 'OSError', 'OverflowError',
'PendingDeprecationWarning', 'PermissionError', 'ProcessLookupError',
'ReferenceError', 'ResourceWarning', 'RuntimeError', 'RuntimeWarning',
'StopIteration', 'SyntaxError', 'SyntaxWarning', 'SystemError',
'SystemExit', 'TabError', 'TimeoutError', 'True', 'TypeError',
'UnboundLocalError', 'UnicodeDecodeError', 'UnicodeEncodeError',
'UnicodeError', 'UnicodeTranslateError', 'UnicodeWarning', 'UserWarning',
'ValueError', 'Warning', 'ZeroDivisionError', '_', '__build_class__',
'__debug__', '__doc__', '__import__', '__name__', '__package__', 'abs',
'all', 'any', 'ascii', 'bin', 'bool', 'bytearray', 'bytes', 'callable',
'chr', 'classmethod', 'compile', 'complex', 'copyright', 'credits',
'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval', 'exec', 'exit',
'filter', 'float', 'format', 'frozenset', 'getattr', 'globals', 'hasattr',
'hash', 'help', 'hex', 'id', 'input', 'int', 'isinstance', 'issubclass',
'iter', 'len', 'license', 'list', 'locals', 'map', 'max', 'memoryview',
'min', 'next', 'object', 'oct', 'open', 'ord', 'pow', 'print', 'property',
'quit', 'range', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice',
'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type', 'vars',
'zip']
6.4. í¨í¤ì§Â¶
í¨í¤ì§ë âì ì¼ë¡ 구ë¶ë 모ë ì´ë¦â 를 ì¨ì íì´ì¬ì 모ë ì´ë¦ ê³µê°ì 구조ííë ë°©ë²ì
ëë¤. ì를 ë¤ì´, 모ë ì´ë¦ A.B ë A ë¼ë ì´ë¦ì í¨í¤ì§ì ìë B ë¼ë ì´ë¦ì ìë¸ ëª¨ëì ê°ë¦¬íµëë¤. 모ëì ì¬ì©ì´ ë¤ë¥¸ 모ëì ì ìë¤ì´ ìë¡ì ì ì ë³ì ì´ë¦ë¤ì ê±±ì í íì ìê² ë§ëë ê²ê³¼ ë§ì°¬ê°ì§ë¡, ì ì¼ë¡ 구ë¶ë 모ëì ì´ë¦ë¤ì NumPy ë Pillow ê³¼ ê°ì ë¤ì¤ 모ë í¨í¤ì§ë¤ì ì ìë¤ì´ ìë¡ì 모ë ì´ë¦ë¤ì ê±±ì í íì ìê² ë§ëëë¤.
ìí¥ íì¼ê³¼ ê³¼ ìí¥ ë°ì´í°ì ì¼ê´ë ì²ë¦¬ë¥¼ ìí 모ëë¤ì 컬ë ì
(âí¨í¤ì§â) ì ì¤ê³í길 ìíë¤ê³ í©ìë¤. ì¬ë¬ ì¢
ë¥ì ìí¥ íì¼ íìì´ ìì¼ë¯ë¡ (ë³´íµ íì¥ìë¡ êµ¬ë¶ë©ëë¤, ì를 ë¤ì´: .wav, .aiff, .au), ë¤ìí íì¼ íì ê°ì ë³íì ìí´ ê³ì ëì´ëë 모ëë¤ì 컬ë ì
ì ë§ë¤ê³ ì ì§í íìê° ììµëë¤. ëí, ìí¥ ë°ì´í°ì ì ì©íê³ ì íë ë§ì ì¢
ë¥ì ì°ì°ë¤ë ìì¼ë¯ë¡ (믹ì±, ìì½ ë£ê¸°, ì´íë¼ì´ì ê¸°ë¥ ì ì©, ì¸ê³µì ì¸ ì¤í
ë ì¤ í¨ê³¼ ë§ë¤ê¸°ì ê°ì), ì´ ì°ì°ë¤ì ìíí기 ìí 모ëë¤ì ëììì´ ìì±íê² ë ê²ì
ëë¤. í¨í¤ì§ë¥¼ ì´ë ê² êµ¬ì±í´ ë³¼ ì ììµëë¤ (ê³ì¸µì íì¼ ìì¤í
ì¼ë¡ íííìµëë¤):
sound/ ìµìì í¨í¤ì§
__init__.py sound í¨í¤ì§ ì´ê¸°í
formats/ íì¼ íì ë³íì ìí ìë¸ í¨í¤ì§
__init__.py
wavread.py
wavwrite.py
aiffread.py
aiffwrite.py
auread.py
auwrite.py
...
effects/ ìí¥ í¨ê³¼ë¥¼ ìí ìë¸ í¨í¤ì§
__init__.py
echo.py
surround.py
reverse.py
...
filters/ íí°ë¥¼ ìí ìë¸ í¨í¤ì§
__init__.py
equalizer.py
vocoder.py
karaoke.py
...
í¨í¤ì§ë¥¼ ìí¬í¸í ë, íì´ì¬ì sys.path ì ìë ëë í°ë¦¬ë¤ì ê²ìíë©´ì í¨í¤ì§ ìë¸ ëë í°ë¦¬ë¥¼ ì°¾ìµëë¤.
íì´ì¬ì´ ëë í°ë¦¬ë¥¼ í¨í¤ì§ë¡ ì·¨ê¸íê² ë§ë¤ê¸° ìí´ì __init__.py íì¼ì´ íìí©ëë¤ (ë¹êµì ê³ ê¸ ê¸°ë¥ì¸ ì´ë¦ ê³µê° í¨í¤ì§ë¥¼ ì¬ì©íì§ ìëë¤ë©´). ì´ë ê² íë©´ string ì²ë¼ íí ì°ë ì´ë¦ì ëë í°ë¦¬ê°, ìëíì§ ìê² ëª¨ë ê²ì ê²½ë¡ì ë¤ì ë±ì¥íë ì¬ë°ë¥¸ 모ëë¤ì ê°ë¦¬ë ì¼ì ë°©ì§í©ëë¤. ê°ì¥ ê°ë¨í ê²½ì°, __init__.py ë ê·¸ë¥ ë¹ íì¼ì¼ ì ìì§ë§, í¨í¤ì§ì ì´ê¸°í ì½ë를 ì¤ííê±°ë ë¤ìì ì¤ëª
íë __all__ ë³ì를 ì¤ì í ì ììµëë¤.
í¨í¤ì§ ì¬ì©ìë í¨í¤ì§ë¡ë¶í° ê°ë³ 모ëì ìí¬í¸í ì ììµëë¤, ì를 ë¤ì´:
import sound.effects.echo
ì´ê²ì ìë¸ ëª¨ë sound.effects.echo 를 ë¡ëí©ëë¤. ì ì²´ ì´ë¦ì¼ë¡ 참조ëì´ì¼ í©ëë¤.
sound.effects.echo.echofilter(input, output, delay=0.7, atten=4)
ìë¸ ëª¨ëì ìí¬í¸íë ë¤ë¥¸ ë°©ë²ì ì´ë ìµëë¤:
from sound.effects import echo
ì´ê²ë ìë¸ ëª¨ë echo 를 ë¡ëíê³ , í¨í¤ì§ ì ëì´ ìì´ ì¬ì©í ì ìê² í©ëë¤. ê·¸ëì ì´ë° ìì¼ë¡ ì¬ì©í ì ììµëë¤:
echo.echofilter(input, output, delay=0.7, atten=4)
ë ë¤ë¥¸ ë°©ë²ì ìíë í¨ìë ë³ì를 ì§ì ìí¬í¸íë ê²ì ëë¤:
from sound.effects.echo import echofilter
ëë¤ì, ì´ê²ì ìë¸ ëª¨ë echo 를 ë¡ëíì§ë§, í¨ì echofilter() 를 ì§ì ì¬ì©í ì ìê² ë§ëëë¤:
echofilter(input, output, delay=0.7, atten=4)
from package import item 를 ì¬ì©í ë, itemì í¨í¤ì§ì ìë¸ ëª¨ë (ëë ìë¸ í¨í¤ì§)ì¼ ìë ìê³ í¨ì, í´ëì¤, ë³ì ë± í¨í¤ì§ì ì ìë ë¤ë¥¸ ì´ë¦ë¤ì¼ ìë ììì ì ìíì¸ì. import 문ì 먼ì itemì´ í¨í¤ì§ì ì ìëì´ ìëì§ ê²ì¬íê³ , ê·¸ë ì§ ìì¼ë©´ 모ëì´ë¼ê³ ê°ì íê³ ë¡ë를 ìëí©ëë¤. ì°¾ì§ ëª»íë¤ë©´, ImportError ìì¸ë¥¼ ì¼ì¼íµëë¤.
ì´ì ë°íì¬, import item.subitem.subsubitem ì ê°ì 문ë²ì ì¬ì©í ë, ë§ì§ë§ ê²ì ì ì¸í ê° í목ì ë°ëì í¨í¤ì§ì¬ì¼ í©ëë¤; ë§ì§ë§ í목ì 모ëì´ë í¨í¤ì§ê° ë ì ìì§ë§, ìì í목ìì ì ìë í´ëì¤, í¨ì, ë³ì ë±ì´ ë ìë ììµëë¤.
6.4.1. í¨í¤ì§ìì * ìí¬í¸ í기¶
ì´ì from sound.effects import * ë¼ê³ ì°ë©´ ì´ë»ê² ë ê¹? ì´ìì ì¼ë¡ë, ì´ë»ê²ë íì¼ ìì¤í
ìì í¨í¤ì§ì ì´ë¤ 모ëë¤ì´ ë¤ì´ìëì§ ì°¾ì ë¤ì, ê·¸ê²ë¤ 모ë를 ìí¬í¸ í기를 ìí ê²ì
ëë¤. ì´ë ê² íë ë°ë ìê°ì´ ì¤ë ê±¸ë¦¬ê³ ìë¸ ëª¨ëì ìí¬í¸ í¨ì ë°ë¼ ì´ë¤ ìë¸ ëª¨ëì ëª
ìì ì¼ë¡ ìí¬í¸í ê²½ì°ë§ ì¼ì´ëì¼ë§ íë ìíì§ ìë ë¶ìì í¨ê³¼ê° ë°ìí ì ììµëë¤.
ì ì¼í í´ê²°ì±
ì í¨í¤ì§ ì ìê° í¨í¤ì§ì ìì¸ì ëª
ìì ì¼ë¡ ì ê³µíë ê²ì
ëë¤. import 문ì ë¤ìê³¼ ê°ì ê´ë¡ê° ììµëë¤: í¨í¤ì§ì __init__.py ì½ëê° __all__ ì´ë¼ë ì´ë¦ì 목ë¡ì ì ê³µíë©´, ì´ê²ì from package import * 를 ë§ë ë ìí¬í¸ í´ì¼ë§ íë 모ë ì´ë¦ë¤ì 목ë¡ì¼ë¡ ë°ìë¤ì
ëë¤. ì ë²ì ì í¨í¤ì§ë¥¼ ì¶ìí ë ì´ ëª©ë¡ì ìµì ìíë¡ ì ì§íë ê²ì í¨í¤ì§ ì ìì ì±
ìì
ëë¤. í¨í¤ì§ ì ìê° í¨í¤ì§ìì * 를 ìí¬í¸íë ì©ëê° ìë¤ê³ íë¨íë¤ë©´, ì´ê²ì ì§ìíì§ ìê¸°ë¡ í ìë ììµëë¤. ì를 ë¤ì´, íì¼ sound/effects/__init__.py ë ë¤ìê³¼ ê°ì ì½ë를 í¬í¨í ì ììµëë¤:
__all__ = ["echo", "surround", "reverse"]
ì´ê²ì from sound.effects import * ê° sound.effects í¨í¤ì§ì ì´ë¦ì ì§ì í ì¸ ìë¸ ëª¨ëë¤ì ìí¬í¸íê² ë¨ì ì미í©ëë¤.
ìë¸ ëª¨ëì´ ì§ìì ì¼ë¡ ì ìë ì´ë¦ì ìí´ ê°ë ¤ì§ ì ììì ì ìíì¸ì. ì를 ë¤ì´, reverse í¨ì를 sound/effects/__init__.py íì¼ì ì¶ê°íë©´, from sound.effects import *ë echoì surround ë ìë¸ ëª¨ëë§ ìí¬í¸í ë¿, reverse ìë¸ ëª¨ëì ìí¬í¸íì§ ììµëë¤. ì§ìì ì¼ë¡ ì ìë reverse í¨ìì ìí´ ê°ë ¤ì§ê¸° ë문ì
ëë¤:
__all__ = [
"echo", # 'echo.py' íì¼ì ê°ë¦¬íµëë¤
"surround", # 'surround.py' íì¼ì ê°ë¦¬íµëë¤
"reverse", # !!! ì´ì 'reverse' í¨ì를 ê°ë¦¬íµëë¤ !!!
]
def reverse(msg: str): # <-- 'from sound.effects import *' ì ê²½ì°ì,
return msg[::-1] # ì´ ì´ë¦ì´ 'reverse.py' ìë¹ ëª¨ëì ê°ë¦½ëë¤
__all__ ì´ ì ìëì§ ìì¼ë©´, ë¬¸ì¥ from sound.effects import * ì í¨í¤ì§ sound.effects ì 모ë ìë¸ ëª¨ëë¤ì íì¬ ì´ë¦ ê³µê°ì¼ë¡ ìí¬í¸ íì§ ììµëë¤; ì´ê²ì ì¤ì§ í¨í¤ì§ sound.effects ê° ìí¬í¸ ëëë¡ ë§ë¤ê³ (__init__.py ì ìë ì´ê¸°í ì½ëë¤ì´ ìíë ì ììµëë¤), ê·¸ í¨í¤ì§ê° ì ìíë ì´ë¦ë¤ì ìí¬í¸ í©ëë¤. ì´ ì´ë¦ë¤ì __init__.py ê° ì ìíë 모ë ì´ë¦ (ê·¸ë¦¬ê³ ëª
ìì ì¼ë¡ ë¡ëë ìë¸ ëª¨ëë¤)ì í¬í¨í©ëë¤. ì´ ì´ë¦ë¤ìë ì¬ì ì import 문ì¼ë¡ ëª
ìì ì¼ë¡ ë¡ëë í¨í¤ì§ì ìë¸ ëª¨ëë¤ ìì í¬í¨ë©ëë¤. ì´ ì½ë를 ìê°í´ë´
ìë¤:
import sound.effects.echo
import sound.effects.surround
from sound.effects import *
ì´ ììì, echo ì surround 모ëì´ íì¬ ì´ë¦ ê³µê°ì¼ë¡ ìí¬í¸ ëëë°, from...import ë¬¸ì´ ì¤íë ë sound.effects í¨í¤ì§ì ì ìë기 ë문ì
ëë¤. (__all__ ì´ ì ìë ëë ë§ì°¬ê°ì§ëë¤.)
ì¤ì¬ ì´ë¤ 모ëì´ import * 를 ì¬ì©í ë í¹ì í¨í´ì ë°ë¥´ë ì´ë¦ë¤ë§ ìµì¤í¬í¸ íëë¡ ì¤ê³ëìë¤ íëë¼ë, íë¡ëì
ì½ëììë ì¬ì í ì¢ì§ ìì ì¬ë¡ë¡ ì¬ê²¨ì§ëë¤.
from package import specific_submodule ì ì¬ì©íëë° ì못ë ê²ì ìë¤ë ê²ì 기ìµíì¸ì! ì¬ì¤, ìí¬í¸íë 모ëì´ ë¤ë¥¸ í¨í¤ì§ìì ê°ì ì´ë¦ì ìë¸ ëª¨ëì ì¬ì©í íìê° ìë í ê¶ì¥ëë í기ë²ì
ëë¤.
6.4.2. í¨í¤ì§ ë´ë¶ ê°ì 참조¶
í¨í¤ì§ê° ìë¸ í¨í¤ì§ë¤ë¡ 구조íë ë (ììì ëì¨ sound í¨í¤ì§ì²ë¼), ì´ì í¨í¤ì§ì ìë¸ ëª¨ëì ê°ë¦¬í¤ëë° ì ë ìí¬í¸ë¥¼ ì¬ì©í ì ììµëë¤. ì를 ë¤ì´, 모ë sound.filters.vocoder ì´ sound.effects í¨í¤ì§ì echo 모ëì´ íìíë©´, from sound.effects import echo 를 ì¬ì©í ì ììµëë¤.
ìë ìí¬í¸ë¥¼ ì¸ ìë ìëë°, from module import name ííì ìí¬í¸ 문ì ì¬ì©í©ëë¤. ì´ ìí¬í¸ë ìë ìí¬í¸ì ìë°ëë íì¬ì ë¶ëª¨ í¨í¤ì§ë¥¼ ê°ë¦¬í¤ê¸° ìí´ ìì ë¶ë ì ì ì¬ì©í©ëë¤. ì를 ë¤ì´, surround 모ëìì, ì´ë ê² ì¬ì©í ì ììµëë¤:
from . import echo
from .. import formats
from ..filters import equalizer
Note that relative imports are based on the name of the current moduleâs package. Since the main module does not have a package, modules intended for use as the main module of a Python application must always use absolute imports.
6.4.3. ì¬ë¬ ëë í°ë¦¬ì ìë í¨í¤ì§Â¶
í¨í¤ì§ë í¹ë³í ì´í¸ë¦¬ë·°í¸ íë를 ë ì§ìí©ëë¤, __path__. ì´ê²ì í¨í¤ì§ì __init__.py íì¼ì ì¤íí기 ì ì, ì´ íì¼ì´ ë¤ì´ìë ëë í°ë¦¬ì ì´ë¦ì í¬í¨íë 문ìì´ì ìíì¤ë¡ ì´ê¸°íë©ëë¤. ì´ ë³ìë ìì í ì ììµëë¤; ê·¸ë ê² íë©´ ê·¸ ì´íë¡ í¨í¤ì§ì í¬í¨ë 모ëê³¼ ìë¸ í¨í¤ì§ë¥¼ ê²ìíë ë° ìí¥ì ì£¼ê² ë©ëë¤.
ì´ ê¸°ë¥ì´ ì주 íìíì§ë ìì§ë§, í¨í¤ì§ìì ë°ê²¬ëë 모ëì ì§í©ì íì¥íë ë° ì¬ì©ë©ëë¤.
ê°ì£¼