f1()
이라는 함수가 포함 된 utils.py
파일이 있습니다.가져 오기와 execfile의 차이점
import utils
또는 execfile('utils.py')
다른 파이썬 스크립트에서 액세스 할 수 있으며 f1()
에 액세스 할 수 있습니다. 두 방법의 차이점은 무엇입니까?
f1()
이라는 함수가 포함 된 utils.py
파일이 있습니다.가져 오기와 execfile의 차이점
import utils
또는 execfile('utils.py')
다른 파이썬 스크립트에서 액세스 할 수 있으며 f1()
에 액세스 할 수 있습니다. 두 방법의 차이점은 무엇입니까?
많은 차이점이 있지만 가장 중요한 것은 import
이 utils.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__':
절 안에 있습니다.