2014-12-17 2 views
3

f1()이라는 함수가 포함 된 utils.py 파일이 있습니다.가져 오기와 execfile의 차이점

import utils 또는 execfile('utils.py') 다른 파이썬 스크립트에서 액세스 할 수 있으며 f1()에 액세스 할 수 있습니다. 두 방법의 차이점은 무엇입니까?

답변

3

많은 차이점이 있지만 가장 중요한 것은 importutils.py에 정의 된 개체가 끝나는 네임 스페이스를보다 잘 제어 할 수 있다는 것입니다. import

일부 변종 :이 경우

import utils 
utils.f1() 

utils가 작업 공간에 추가 된 유일한 상징은 --- 어떤 귀하의 기본 작업 공간에 f1을 기존의 것은 덮어 쓰기 및되지 않았을 것입니다 없음이면 f1()은 인식되지 않습니다. 유지하고자하는 코드의 경우 가져 오기의이 방법을 선호합니다. 왜냐하면 내 소스 파일을 utils에 의존하는 모든 위치에서 쉽게 검색 할 수 있기 때문입니다.

그러나 당신이 할 수있는 모든 시간이 너무 장황 utils.f1()을 말하는 경우 :

from utils import f1 
f1() 

을 이제 utils.f1()f1 때문에이 작업 공간에 가져온 호출 할 것이다 f1()을 말한다면. 하지만 최소한이 유형의 import 문은 가져온 기호와 가져 오지 않은 기호를 정확하게 제어 할 수 있습니다. 당신은이 과정에서 심볼의 이름을 바꿀 수 있습니다 : 이제

from utils import * 

, 기호 가져온 알고 : 기본적으로 모든 utils이있다

마지막으로
from utils import f1 as EffOne 
EffOne() 

당신이 완전히 네임 스페이스 통제를 잃고 선택할 수 있습니다 세계를 제공하는 것입니다 (또는 utils 개발자가 __all__ 속성을 지정하는 데 어려움을 겪었다면 거기에 모든 것이 나열되어 있습니다). 만약 당신이 단지 import *을 사용하는 것이 좋습니다.

네임 스페이스의 관점에서 execfile('utils.py')은 과 거의 동일하므로 utils에 정의 된 모든 기호를 작업 영역에 덤프합니다. 하나의 약간의 차이점은 그것이 정의되어 있다면 __all__의 심볼로 제한되지 않는다는 것입니다 (실제로는 __all__ 심볼 자체가 다른 모든 것과 함께 무릎에 버려집니다).

네임 스페이스 이외에도 from utils import *execfile('utils.py') 사이에는 여전히 많은 차이점이 있습니다. 하나는 캐싱입니다 : utils에 대한 두 번째 import 호출은 매우 빠르며 (코드는 다시 실행되지 않습니다) 코드 이 다시 실행되기 때문에 execfile('utils.py')에 대한 두 번째 호출이 첫 번째 호출만큼 길어질 수 있습니다. 또한 utils.py의 작성자가 가져 오기 시간에 실행하고 싶지 않지만 파일이 execfile을 통해 실행될 때만 utils.py 내부에 일부 코드 (흔히 테스트 코드)가있을 수 있습니다. 이러한 코드는 if __name__ == '__main__': 절 안에 있습니다.

관련 문제