부제목


6. 모듈

파이썬을 끝내고 다시 들어가 보면, 앞서 만들었던 (함수와 변수의) 정의가 사라집니다. 그러므로, 좀 긴 프로그램을 작성하고 싶다면, 대신에 텍스트 편집기를 사용하여 인터프리터에게 먹일 입력을 준비하고 그 파일을 입력으로 하여 실행하는 편이 더 좋습니다. 이를 이른바 스크립트(script)를 만든다고 합니다. 프로그램이 커질수록, 여러 파일로 나누어서 더 편하게 관리하고 싶어집니다. 또 여러 프로그램에 작성해 둔 편리한 함수를 사용하고 싶을 수도 있습니다. 각 프로그램 안으로 그의 정의를 복사해 넣고 않고서 말입니다.

이를 지원하기 위해 파이썬은 정의를 파일 안에 두고 그 파일을 스크립트로 사용하거나 인터프리터의 상호대화 세션에서 사용하는 방법을 제공합니다. 그런 파일을 모듈(module)이라고 부릅니다; 모듈로부터 정의를 다른 모듈이나 메인(main) 모듈 (최상위 수준에서 실행되는 스크립트나 계산기 모드에서 접근하는 변수 집단) 안으로 반입할(imported)수 있습니다.

모듈은 파이썬 정의와 서술문을 담은 파일입니다. 파일 이름은 접미사가 .py 같은 모듈 이름입니다. 모듈 안에서, 모듈의 이름은 전역 변수 __name__의 값에서 (문자열로) 얻을 수 있습니다. 예를 들면, 텍스트 편집기를 사용하여 다음 내용으로 fibo.py라고 부르는 파일을 현재 디렉토리에 만들어 보세요:

# 피보나치 숫자 모듈

def fib(n):    # 피보나치 수열을 n까지 작성
    a, b = 0, 1
    while b < n:
        print b,
        a, b = b, a+b

def fib2(n): # 피보나치 수열을  n까지 작성
    result = []
    a, b = 0, 1
    while b < n:
        result.append(b)
        a, b = b, a+b
    return result

이제 파이썬 인터프리터에 들어가 이 모듈을 다음과 같은 명령어로 반입하세요:

>>> import fibo

이렇게 하더라도 fibo에 정의된 함수의 이름이 현재 심볼 테이블에 직접적으로 반입되지는 않습니다; 오직 모듈 이름 fibo만 현재 심볼 테이블에 반입될 뿐입니다. 모듈 이름을 사용하면 함수에 접근할 수 있습니다:

>>> fibo.fib(1000)
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
>>> fibo.fib2(100)
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
>>> fibo.__name__
'fibo'

함수를 자주 사용할 생각이라면 그것을 지역 이름에 할당하면 됩니다:

>>> fib = fibo.fib
>>> fib(500)
1 1 2 3 5 8 13 21 34 55 89 144 233 377


6.1 모듈에 대하여 더 자세히

모듈에는 함수 정의 뿐만 아니라 실행 서술문도 담길 수 있습니다. 이런 서술문들은 그 모듈을 초기화하기 위해서 있습니다. 모듈이 어딘가에서 반입될 때 처음 다 한 번만 실행됩니다.6.1

각 모듈은 따로 심볼 테이블을 가집니다. 이 심볼 테이블은 그 모듈에 정의된 모든 함수들이 전역 심볼 테이블로 사용합니다. 그리하여, 모듈의 저자는 우연히 사용자의 전역 변수와 충돌할까바 걱정할 필요없이 전역 변수를 그 모듈에서 사용할 수 있습니다. 한편, 무슨 일을 하고 있는지 이해하고 있다면 그의 함수를 가리키는데 사용한 것과 같은 표기법, modname.itemname을 사용하여 모듈의 전역 변수를 건드릴 수 있습니다.

모듈은 다른 모듈을 반입할 수 있습니다. 모듈 (또는 스크립트)의 앞에다 import 서술문을 배치하는 것은 관례적이지 필수적인 것은 아닙니다. 반입된 모듈 이름은 반입하는 모듈의 전역 심볼 테이블에 배치됩니다.

import 서술문에 변형을 주어서 반입하는 모듈의 심볼 테이블 안으로 직접 모듈의 이름을 반입할 수 있습니다. 예를 들어:

>>> from fibo import fib, fib2
>>> fib(500)
1 1 2 3 5 8 13 21 34 55 89 144 233 377

모듈 이름은 지역 심볼 테이블에 반입되지 않습니다 (그래서 예제에서는 fibo가 정의되지 않습니다).

모듈에 정의된 이름을 모두 반입하는 변형도 있습니다:

>>> from fibo import *
>>> fib(500)
1 1 2 3 5 8 13 21 34 55 89 144 233 377

이것은 밑줄(_)로 시작하는 이름을 제외하고 모든 이름을 반입합니다.


6.1.1 모듈을 스크립트로 실행하기

파이썬 모듈을 다음과 같이 실행하면

python fibo.py <인자 건네기s>

모듈 안의 코드가 마치 도입한 것처럼 실행됩니다. 그러나 __name__"__main__"으로 설정됩니다. 다시 말해 다음 코드를 모듈의 끝에 덧붙이면:

if __name__ == "__main__":
    import sys
    fib(int(sys.argv[1]))

파일을 반입가능한 모듈로 사용할 수 있을 뿐만 아니라 스크립트로도 사용할 수 있습니다. 왜냐하면 명령어 줄을 해석하는 코드는 오직 그 모듈이 ``main'' 파일로 실행될 때만 실행되기 때문입니다:

$ python fibo.py 50
1 1 2 3 5 8 13 21 34

모듈이 반입되더라도, 실행되지는 않습니다:

>>> import fibo
>>>

이 방법은 모듈에 편리한 사용자 인터페이스를 제공하거나 또는 테스트 목적에 자주 사용됩니다 (모듈을 스크립트로 실행하면 테스트 모듬이 실행됩니다.).


6.1.2 모듈 검색 경로

이름이 spam인 모듈이 도입되면, 파이썬은 현재 디렉토리에서 이름이 spam.py인 파일을 찾고, 다음으로 환경변수 PYTHONPATH에 지정된 디렉토리들을 찾습니다. PYTHONPATH는 쉘 변수 PATH와 문법이 같은데, 즉 디렉토리 이름이 담긴 리스트입니다. PYTHONPATH가 설정되어 있지 않거나, 파일이 거기에서 발견되지 않으면, 설치-관련 기본 경로를 검색합니다; Unix에서는 보통 기본 경로가 .:/usr/local/lib/python입니다.

실제로, 모듈은 sys.path 변수에 주어진 디렉토리 목록에서 검색됩니다. 이 변수는 입력 스크립트가 담긴 디렉토리 (또는 현재 디렉토리)와 PYTHONPATH 그리고 설치-관련 기본값으로 초기화 됩니다. 이 덕분에 파이썬 프로그램들은 모듈 검색 경로를 수정하거나 교체하기 위하여 자신이 무엇을 해야할지 알 수 있습니다. 스크립트가 실행되는 디렉토리는 검색 경로에 있기 때문에, 스크립트가 표준 모듈과 이름이 같지 않도록 하는 것이 중요합니다. 그렇지 않으면 파이썬은 모듈이 반입될 때 스크립트를 모듈로 적재하려고 할 것입니다. 이는 일반적으로 에러입니다. 더 자세한 정보는 섹션 6.2``표준 모듈''을 참조하세요.

6.1.3 ``컴파일된'' 파이썬 파일

표준 모듈을 많이 사용하는 짧은 프로그램에 대하여 기동시간을 줄이기 위하여, spam.pyc라는 파일이 spam.py가 있는 디렉토리에 존재하면, spam 모듈이 이미-``바이트-컴파일되어'' 포함되어 있다고 간주됩니다. spam.pyc를 만드는데 사용된 spam.py를 수정한 시간이 spam.pyc에 기록되며, 이것이 일치하지 않으면 .pyc 파일은 무시됩니다.

보통, spam.pyc 파일을 만들기 위해 아무것도 할 필요가 없습니다. spam.py가 성공적으로 컴파일될 때마다, 컴파일된 버전을 spam.pyc로 작성하려고 시도합니다. 이 시도가 실패하더라도 에러가 아닙니다; 어떤 이유로 파일이 완전히 씌여지지 않았다면, 결과 spam.pyc 파일은 무효하다고 간주되고 그리하여 나중에 무시됩니다. spam.pyc 파일의 내용은 플랫폼과 상관이 없습니다. 그래서 파이썬 모듈 디렉토리는 서로 다른 기종사이에 공유가 가능합니다.

전문가를 위한 몇가지 조언:


6.2 표준 모듈

파이썬에는 표준 모듈 라이브러리가 따라옵니다. 따로 파이썬 라이브러리 참조서라는 문서에 기술되어 있습니다(이후로 ``라이브러리 참조서''). 어떤 모듈은 인터프리터에 내장되어 들어가 있습니다; 언어의 핵심은 아니지만 그럼에도 효율성을 위해서나 시스템 호출 같은 운영체제 원자명령어에 접근을 제공하기 위하여 내장되어 들어가 있습니다. 그런 모듈 집합은 아래의 플랫폼에 따라 구성됩니다. 예를 들어 amoeba 모듈은 Amoeba 원자명령어를 제공하는 시스템에만 제공됩니다. 한가지 특별한 모듈은 좀 관심을 둘 만 합니다: sys 모듈은 어느 파이썬 인터프리터에도 내장되어 있습니다. 변수 sys.ps1sys.ps2에 1차 프롬프트와 2차 프롬프트에 사용된 문자열이 정의되어 있습니다:

>>> 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)
['__displayhook__', '__doc__', '__excepthook__', '__name__', '__stderr__',
 '__stdin__', '__stdout__', '_getframe', 'api_version', 'argv', 
 'builtin_module_names', 'byteorder', 'callstats', 'copyright',
 'displayhook', 'exc_clear', 'exc_info', 'exc_type', 'excepthook',
 'exec_prefix', 'executable', 'exit', 'getdefaultencoding', 'getdlopenflags',
 'getrecursionlimit', 'getrefcount', 'hexversion', 'maxint', 'maxunicode',
 'meta_path', '모듈', 'path', 'path_hooks', 'path_importer_cache',
 'platform', 'prefix', 'ps1', 'ps2', 'setcheckinterval', 'setdlopenflags',
 'setprofile', 'setrecursionlimit', 'settrace', 'stderr', 'stdin', 'stdout',
 'version', 'version_info', 'warnoptions']

인자가 없으면 dir()은 현재 정의된 이름들을 보여줍니다:

>>> a = [1, 2, 3, 4, 5]
>>> import fibo
>>> fib = fibo.fib
>>> dir()
['__builtins__', '__doc__', '__file__', '__name__', 'a', 'fib', 'fibo', 'sys']

모든 종류의 이름을 보여줌에 주목하세요: 변수, 모듈, 함수, 등등.

dir()은 내장 함수의 이름과 변수는 나열하지 않습니다. 그 목록을 보고 싶다면, 표준 모듈 __builtin__에 정의되어 있습니다:

>>> import __builtin__
>>> dir(__builtin__)
['ArithmeticError', 'AssertionError', 'AttributeError', 'DeprecationWarning',
 'EOFError', 'Ellipsis', 'EnvironmentError', 'Exception', 'False',
 'FloatingPointError', 'FutureWarning', 'IOError', 'ImportError',
 'IndentationError', 'IndexError', 'KeyError', 'KeyboardInterrupt',
 'LookupError', 'MemoryError', 'NameError', 'None', 'NotImplemented',
 'NotImplementedError', 'OSError', 'OverflowError', 
 'PendingDeprecationWarning', 'ReferenceError', 'RuntimeError',
 'RuntimeWarning', 'StandardError', 'StopIteration', 'SyntaxError',
 'SyntaxWarning', 'SystemError', 'SystemExit', 'TabError', 'True',
 'TypeError', 'UnboundLocalError', 'UnicodeDecodeError',
 'UnicodeEncodeError', 'UnicodeError', 'UnicodeTranslateError',
 'UserWarning', 'ValueError', 'Warning', 'WindowsError',
 'ZeroDivisionError', '_', '__debug__', '__doc__', '__import__',
 '__name__', 'abs', 'apply', 'basestring', 'bool', 'buffer',
 'callable', 'chr', 'classmethod', 'cmp', 'coerce', 'compile',
 'complex', 'copyright', 'credits', 'delattr', 'dict', 'dir', 'divmod',
 'enumerate', 'eval', 'execfile', 'exit', 'file', 'filter', 'float',
 'frozenset', 'getattr', 'globals', 'hasattr', 'hash', 'help', 'hex',
 'id', 'input', 'int', 'intern', 'isinstance', 'issubclass', 'iter',
 'len', 'license', 'list', 'locals', 'long', 'map', 'max', 'min',
 'object', 'oct', 'open', 'ord', 'pow', 'property', 'quit', 'range',
 'raw_input', 'reduce', 'reload', 'repr', 'reversed', 'round', 'set',
 'setattr', 'slice', 'sorted', 'staticmethod', 'str', 'sum', 'super',
 'tuple', 'type', 'unichr', 'unicode', 'vars', 'xrange', 'zip']


6.4 패키지(Packages)

패키지는 ``모듈 이름에 점을 붙여'' 파이썬의 모듈 이름공간을 구성하는 방법입니다. 예를 들어, 모듈 이름 A.B는 이름이 "A"인 패키지 안에 이름이 "B"인 모듈을 가리킵니다. 모듈을 사용하면 서로 다른 모듈의 저자들끼리 다른 이의 전역 변수 이름에 신경쓸 필요가 없는 것과 마찬가지로, 점붙은 모듈 이름을 사용하면 NumPy나 PIL 같은 다중-모듈 패키지의 저자들이 다른 이의 모듈 이름에 신경쓰지 않아도 됩니다.

사운드 파일과 데이터를 일정 형태로 처리하는 모듈 집단(즉 ``패키지'')을 디자인하고 싶다고 해 봅시다. 사운드 파일 포맷은 다양하게 많습니다 (보통 확장자로 인지되는데, 예를 들면: .wav, .aiff, .au가 있습니다). 그래서 다양한 파일 포맷 사이에 변환을 위해 모듈을 만들어내고 집단이 늘어나는 것을 관리할 필요가 있습니다. 사운드 데이터에 대하여 수행하고 싶은 연산도 다양합니다 (예를 들어 믹싱, 에코처리, 이퀄라이저 기능 적용, 인위적으로 스테레오 효과내기). 그래서 이런 연산을 수행하기 위하여 끝없이 모듈을 작성할 것입니다. 다음과 같이 패키지를 구성할 수 있습니다 (계통적 파일 시스템의 관점에서 표현):

sound/                          최-상위 패키지
      __init__.py               사운트 패키지 초기화
      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 형태를 사용할 때, 항목은 그 패키지의 서브모듈 (또는 서브패키지)이거나, 이를테면 함수나 클래스 또는 변수 같이 패키지에 정의된 다른 이름들일 수 있습니다. import 서술문은 먼저 그 항목이 패키지에 정의되어 있는지 테스트합니다; 정의되어 있지 않으면, 모듈이라고 생각하고 적재를 시도합니다. 찾지 못하면, ImportError 예외가 일어납니다.

반대로, import item.subitem.subsubitem와 같은 구문을 사용하면, 각 항목은 마지막 항목을 제외하고 패키지가 되어야 합니다; 마지막 항목은 모듈이거나 패키지일 수 있지만 앞의 항목에 정의된 클래스나 함수 또는 변수가 되면 안됩니다.


6.4.1 패키지로부터 * 반입하기

이제 사용자가 from sound.effects import *라고 쓰면 무슨 일이 일어날까요? 이상적으로 말해, 이렇게 해서 어쨌든 파일시스템으로 나아가 패키지에 있는 지정된 서브모듈을 찾아서 모조리 반입하기를 희망할 것입니다. 불행하게도, 이런 연산은 윈도우즈 플랫폼에서 잘 작동하지 않습니다. 윈도우즈에서 파일 시스템은 파일이름의 대소문자에 관한 정보가 정확하지 않습니다! 이런 플랫폼에서는 ECHO.PY 파일이 echo 모듈이나 Echo 또는 ECHO로 반입되어야 하는지 확실하게 알 방법이 없습니다 (예를 들어, Windows 95는 모든 파일 이름에 첫 자를 대문자로 보여주는 짜증나는 관례를 가지고 있습니다.) 게다가 긴 모듈 이름에 대하여 DOS 8+3 파일이름 제한은 또다른 흥미로운 문제입니다.

유일한 해결책은 패키지 저자가 명시적으로 패키지의 인덱스를 제공하는 것입니다. 다음과 같은 관례로 반입 서술문이 사용됩니다: 패키지의 __init__.py 코드에 __all__라는 이름의 리스트가 정의되어 있으면, 그 리스트를 from package import *를 만나면 반입해야 할 모듈 이름 리스트로 취합니다. 패키지의 새로운 버전이 나올 때 이 리스트를 갱신 유지하는 것은 패키지 저자에게 달려 있습니다. 패키지에서 *로 반입하지 않는다면 패키지 저자는 그것을 지원하지 않아도 됩니다. 예를 들어, 파일 sounds/effects/__init__.py는 다음과 같은 코드를 담을 수 있습니다:

__all__ = ["echo", "surround", "reverse"]

이것은 from sound.effects import *sound 패키지에서 이름붙은 모듈 세 개를 반입할 것이라는 뜻입니다.

__all__이 정의되어 있지 않다고 해서, 서술문 from sound.effects import *sound.effects 패키지로부터 모든 하부모듈을 현재 이름공간 안으로 반입하지는 않습니다; 다만 확실한 것은 sound.effects 패키지가 반입되었고 (__init__.py 안에 있는 초기화 코드를 실행하고) 그리고 그 패키지에 정의된 이름은 무엇이든 반입한다는 것입니다. 여기에는 __init__.py에 정의된 이름들이 (그리고 명시적으로 적재된 하부모듈들이) 모두 포함됩니다. 또한 앞의 반입 서술문에 의하여 명시적으로 적재된 패키지의 하부모듈들을 모두 포함합니다. 다음 코드를 생각해 보세요:

import sound.effects.echo
import sound.effects.surround
from sound.effects import *

이 예제에서 echo 모듈과 surround 모듈은 from...import 서술문이 실행될 때 sound.effects 패키지에 정의되어 있기 때문에 현재 이름 공간에 반입됩니다 (이것은 __all__이 정의될 때도 적용됩니다.).

모듈이나 패키지로부터 *를 반입하는 관행은 일반적으로 눈총을 받습니다. 왜냐하면 종종 그렇게 하면 코드를 읽기가 매우 어려워지기 때문입니다. 그렇지만, 상호대화 세션에서 타자수를 줄이기 위해 사용하는 것은 좋습니다. 어떤 모듈들은 특정한 패턴을 따르는 이름 만을 반출하도록 설계되어 있습니다.

from Package import specific_submodule를 사용해도 아무 문제가 없습니다! 사실, 권장하는 표기법입니다. 반입 모듈이 다른 패키지로부터 같은 이름을 가진 하부모듈을 사용할 필요가 없는 한 말입니다.

6.4.2 패키지-내부 참조

하부모듈은 종종 서로 참조할 필요가 있습니다. 예를 들어, surround 모듈은 echo 모듈을 사용할 수 있습니다. 사실, 그런 참조는 너무 흔해서 import 서술문은 먼저 패키지 안을 살펴보고 나서 표준 모듈 검색 경로를 들여다 봅니다. 그리하여, surround 모듈은 그냥 import echofrom echo import echofilter를 사용하면 됩니다. 반입된 모듈이 현재 패키지(현재 모듈이 하부모듈인 패키지)에서 발견되지 않으면, import 서술문은 주어진 이름으로 최-상위 모듈을 찾습니다.

(예제의 sound 패키지와 같이) 패키지가 하부패키지로 구조화되어 있으면, 절대 반입을 사용하여 자손 패키지의 서브모듈을 참조할 수 있습니다. 예를 들어, sound.filters.vocoder 모듈이 sound.effects 패키지에 있는 echo 모듈을 사용할 필요가 있다면, from sound.effects import echo를 사용하면 됩니다.

파이썬 2.5에서부터, 위에 기술한 묵시적인 상대 반입외에도, from module import name 형태로 명시적인 상대 반입을 쓸 수도 있습니다. 이런 명시적인 상태 반입은 상대 반입에 관련된 현재 패키지와 부모 패키지를 구별하기 위하여 앞에 이끄는 점들을 사용합니다. surround 모듈을 예로 들면, 다음과 같이 사용하실 수 있습니다:

from . import echo
from .. import formats
from ..filters import equalizer

명시적 그리고 묵시적 상대 반입 둘 다 현재 모듈의 이름에 기반하고 있음에 주목하세요. 메인 모듈의 이름은 언제나 "__main__"이므로, 파이썬 어플리케이션의 메인 모듈로 사용할 모듈은 언제나 절대 반입을 사용해야 합니다.

6.4.3 여러 디렉토리에 있는 패키지

패키지는 한가지 좀 특별한 속성 __path__를 지원합니다. 이 속성은 __init__.py 코드가 실행되기 전에 리스트로 초기화되는데 이 리스트에 패키지의 __init__.py가 있는 디렉토리의 이름이 담깁니다. 이 변수는 수정이 가능합니다; 이 변수를 수정하면 그 패키지에 포함된 모듈과 하부패키지에 대한 미래의 검색에 영향을 미칩니다.

이 특징이 자주 필요한 것은 아니지만, 패키지에 있는 모듈 세트를 확장하는데 사용할 수 있습니다.



각주

... 어디에선가.6.1
사실 함수 정의도 `실행되는' `서술문'이다; 실행되면 함수 이름이 그 모듈의 전역 심볼 테이블에 들어간다.
변경 제안에 관한 정보는 이 문서에 관하여를 참조.