프리렉 - FREELEC
http://freelec.co.kr/book/catalogue_view.asp?UID=134
이강성저
자격변수는 변수의 이름공간이 주어지는 표현이다. 이름 공간의 구분은 점(.)으로 하며 연속으로 연결될 수 있다. 예를 들어 X.a에서 변수 a의 이름공간은 X이다.
무자격 변수는 찾고자 하는 변수가 LEGB 영역 안에 있을 때 먼저 발견되는 이름을 사용한다. 하지만 다른 이름 공간에 있을 때에는 자격변수 형식으로 표현해야 한다.
import math
math.sin(0.0) # sin 함수는 자격 변수로 표현해야 한다.
###################
class A:
def __init__(self):
self.a = 10 # self 공간 안에서의 변수 a
a = 20 # __init__ 안에서의 지역변수.
def f(self):
#print(a) # ???
print(self.a) # self 공간 안에서의 변수 a. 자격 변수로 표현해야 한다.
import string 은 string 모듈(이름공간)을 가져온다. 현재 이름 공간에 등록되는 이름은 string 뿐이다.
from string import * 는 모듈 string안에 정의된 이름들을 현재 이름 공간에 모두 가져온다.
이름 공간은 일반적으로 사전으로 표현된다.
# 현재 모듈의 전역 이름 공간을 얻는 방법
# 방법 1
ns1 = globals()
# 방법 2
import sys
ns2 = sys.modules[__name__].__dict__
# 가져오기 한 모듈의 이름 공간을 얻는 방법
import math
math.__dict__
!mkdir mypythonlib
%%writefile mypythonlib/spam.py
print('test')
import spam # 모듈 경로를 찾을 수 없다
# 해결방법1 - 모듈이 저장된 경로를 동적으로 추가해준다.
import sys
sys.path.append('mypythonlib')
import spam
# 해결방법2 - 셸 변수 PYTHONPATH에 경로 추가
!export PYTHONPATH=mypythonlib:$PYTHONPATH
import spam
동적으로 모듈을 가져오는 방법은 __import__ 함수를 이용한다.
modulename = 'math'
__import__(modulename)
os = __import__('os')
os.path.join('a', 'b')
path = __import__('os.path', fromlist=['join'])
path.join('a', 'b')
import sys
're' in sys.modules
math
import imp
imp.reload(math) # 강제 재적재
현재 디렉토리가 Speech 부모 라면 다음과 같은 가져오기는 잘 동작한다.
하지만 현재 디렉토리가 Speech/Recognition이라면 다음과 같은 실행 결과가 나온다.
$ python3.3 NN.py
Traceback (most recent call last):
File "NN.py", line 1, in <module>
from . import DTW
SystemError: Parent module '' not loaded, cannot perform relative import
gslee@usan:Recognition$ python3.3 -c 'import NN'
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "./NN.py", line 1, in <module>
from . import DTW
SystemError: Parent module '' not loaded, cannot perform relative import
모듈의 실행은 패키지 바깥쪽에서 해야 한다. 이름이 '__main__'인 모듈이 상대 가져오기를 실행할 수는 없다. 상대 가져오기는 패키지 안에서만 동작한다.