Contents
python 모듈
파이썬 프로그램 파일로 따로 함수나 변수를 정의 한다
파이썬 스크립트를 작성할 때 매번 비슷한 클래스, 함수 코드의 중복을 피하기 위해 공통 부분을 따로 빼서 모듈과 패키지로 만든다
모듈 : 변수, 함수, 클래스 등을 모아 놓은 스크립트 파일
패키지 : 여러 모듈을 묶은 것
모듈 검색 경로
import sys
print(sys.path)
> D:\PycharmProject\python_ch2.7, ...
모듈은 특정 디렉토리에서 찾게 된다. 실행되는 모듈의 위치는 기본적으로 포함된다
다른 프로젝트에 있는 모듈 가져오기
import sys
sys.path.append('D:/PycharmProject/python-modules')
print(sys.path)
import mymath
print(mymath.pi)
print(mymath.add(10,20))
print(mymath.area_circle(10))
NameSpace
프로그래밍 언어에서 특정한 객체를 이름에 따라 구분할 수 있는 범위를 말한다
파이썬 내부의 객체와 특정 이름과 맵핑 관계를 갖게 되는데 이 맵핑을 포함하고 있는 공간을 네임스페이스라 한다
Built in 빌트인 : 기본 내장 함수 및 기본 예외 들의 이름들이 소속
Global 전역 : 모듈 전체에서 통용될 수 있는 이름들이 소속, 모듈별로 존재
Local 지역 : 함수 및 메서드 별로 존재, 함수 내의 지역변수들의 이름들이 소속
출처: https://www.programiz.com/python-programming/namespace
def outer_func():
a=20
def inner_func():
a=30
print('1 : ',locals())
inner_func()
print('2 : ',locals())
a=10
outer_func()
print('3 : ',locals())
>>
1 : {'a': 30}
2 : {'a': 20, 'inner_func':
<function outer_func.<locals>.inner_func at 0x000002A2829E47B8>}
3 : {'__name__': '__main__', '__doc__': None, '__package__': None,
'__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x000002A2828D6550>,
'__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>,
'__file__': 'D:/cafe24/PycharmProject/python_ch2.7/namespace_ex1.py', '__cached__': None,
'outer_func': <function outer_func at 0x000002A28288C1E0>, 'a': 10}
"inner_func" 에서의 지역 네임스페이스는 지역변수 a=30만 포함
"outer_func" 에서의 지역 네임스페이스는 'inner_func' 와 a=20을 포함
모듈 전체에서 지역 네임스페이스는 사실 모듈의 전역 네임스페이스와 같다
아래의 예를 통해 확인해보자
def outer_func():
a=20
def inner_func():
a=30
inner_func()
a=10
outer_func()
print(locals())
print(globals())
>>>
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__':
<_frozen_importlib_external.SourceFileLoader object at 0x000002138FA96550>,
'__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>,
'__file__': 'D:/cafe24/PycharmProject/python_ch2.7/namespace_ex2.py', '__cached__': None,
'outer_func': <function outer_func at 0x000002138FA4C1E0>, 'a': 10}
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__':
<_frozen_importlib_external.SourceFileLoader object at 0x000002138FA96550>,
'__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>,
'__file__': 'D:/cafe24/PycharmProject/python_ch2.7/namespace_ex2.py', '__cached__': None,
'outer_func': <function outer_func at 0x000002138FA4C1E0>, 'a': 10}
> 모듈 전체에서 지역 네임스페이스는 사실 모듈의 전역 네임스페이스와 같음을 볼 수 있다
if __name__ == '__main__' : 의미
namespace 는 __main__ 이 나온다
namespace 는 namespace_ex1.py
print("Namespace:", globals()["__name__"]) 도 똑같이 namespace 는 namespace_ex1.py
>> if __name__ == '__main__':
현재 모듈의 네임스페이스가 __main__에 해당할 때만 if 문 이하를 실행하라
최상위 모듈( 인터프리터에 실행되는 모듈)의 모듈이름은 "__main__" 이다
모듈은 한 번 가져오기만 하면 메모리에 적대되고 공유된다
import 한 module 이름 열거하기
> sys.modules 변수에 저장되어 있다
import mod_a
import mod_b
import mymod
import mymod2
import sys
for key in sys.modules.keys():
print(key)
import 시 그 파일이 한 번 실행되기 때문에
import 될 파일에서 실행시킬 때,
f() 로 따로 빼주는 게 아니라 if __name__ == '__main__' 을 사용한다.
>> 그래서 이 상태로 아래것을 실행했을 때, 2번 실행되었
그걸 막기 위해
| test01.py
import pygame.sound.echo
pygame.sound.echo.echo()
> 함수를 사용하기에 ( 패키지+모듈) 이 너무 길기 때문에 form ~ import 를 사용해서
모듈만 import 하는 방법으로 해보자
| test02. py
from pygame.sound import echo
echo.echo()
| test03.py
from pygame.sound.echo import echo
echo()
| test04.py
import pygame.sound
pygame.sound.echo.echo()
>> ERROR!!
>> 패키지를 import하면 __init__.py 에 정의된 것만 참조할 수 있다
| test05.py
from pygame.sound.echo import echo
echo()
>> ERROR!!
>> from ~ import 아닌 import 단독으로 사용할 떄에는 모듈과 패키지가 마지막이어야 한다
__init__.py
: 해당 디렉토리가 패키지일부임을 알리는 역할을 한다
__init__.py 에 특정 모듈 지정하기
( /pygame/sound/__init.py)
from . import echo
__all__의 사용
__all_은 다음과 같이 import 할때 작동한
from pygame.sound import *
pygame.sound.echo.echo()
> 이 코드는 에러는 발생하지 않는다. init 에 설정해줘씩 때문.
#/pygame/sound/__init__.py
__all__=['echo']
from . import echo
> 만일 __all__ 변수만 설정해주는 경우 ERROR!
[참고]
'IT 공부 > Python' 카테고리의 다른 글
Python 크롤링 연습 (0) | 2019.06.18 |
---|---|
Python 클래스(1) 클래스, 인스턴스 메서드/ 멤버, 인스턴스 변 (0) | 2019.06.17 |
Python 파일입출력 예제 (0) | 2019.06.17 |
Python 기초 str, tuple 등.. (0) | 2019.06.13 |
Python 기초 (0) | 2019.06.12 |