2014-01-16 2 views
0

에서 '내부 기능'수입 :진정한 차이 '정상'이 질문과 관련하여 파이썬

난에 가까운 import 문을 넣어 생각 : 내 물어의 시간에 여기에 인용 local-import-statements-in-python, 이 사용하는 단편은 종속성을보다 명확하게 만들어 가독성을 높입니다. 파이썬 캐시? 내가 신경 써야 할까? 이것은 나쁜 생각입니까?

def Process(): 
    import StringIO 
    file_handle=StringIO.StringIO('hello world') 
    #do more stuff 

for i in xrange(10): Process() 

조금 더 정당화 : 그것은 의 비밀 비트 라이브러리를 사용하는 방법에 대한,하지만 다른 파일로 방법을 리팩토링 때 런타임을 얻을 때까지, 나는 외부 의존성을 놓친 를 실현하지 않습니다 오류.

결국 평 파일의 맨 위에 모듈을 수입하고 함수 정의 내부에서 그것을 가져 사이의 진정한 차이는 무엇입니까
  • :

나는 다음과 같은 질문하고자하는? 예를 들어

, 나는 개인적으로 내가 내에서 import 문을 호출 한 후 정상적으로 실행 듯 내 스크립트가 stangely 충분히 내 파일의 상단에있는 모듈을 가져올 때 충돌하지만 win32com.client 모듈 특정 문제가 발생 그 함수는 그 메소드 중 하나를 호출했다.

자세한 내용은 여기 내 다른 게시물을 참조하십시오. How to launch win32 applications in separate threads in Python.

이 문제는 locals() 및 globals()와 관련이있는 것으로 의심됩니다. 경우에 따라 다르게 업데이트되거나 업데이트되지 않습니다. 제발 저에게 계몽하십시오.

+0

함수에서는'*'imports를 사용할 수 없습니다. (그들은 파이썬의 오래된 버전에서 허용되었다 ...). 이 부분에서 나는 다른 큰 차이가 있다고 생각하지 않습니다. – Bakuriu

답변

0

가져 오기가 처리되는 방식에는 차이가 없습니다 (해당 질문에 대한 대답으로 가져온 이름은 가져온 이름을 가져온 코드의 범위에서만 사용할 수 있음). 따라서 내부에서 완료되면 함수 이름은 해당 함수에 대해 로컬 임).

주요 차이점 - 그리고 함수 내에서 가져 오기를 원할만한 유일한 이유는 모듈 자체를 처음 가져올 때 최상위 수준의 항목이 실행된다는 것입니다. 이것은 순환 수입의 가능성을 가져올 수 있습니다 : 두 파일이 모두 최상위 수준에서 서로를 가져 오면 순환도를 해결할 수 없으며 Python이 예외를 발생시킵니다.

+0

그래서 잘못 작성된 모듈은 locals() [x] 함수를 사용하여 속성을 찾은 다음 globals() [x]를 살펴야 할 때 오류가 발생합니다. 내가 아는 한, 지역 수입을하면 전역 변수가 업데이트되지 않아야한다. – kstratis

+0

실제로 순환 수입은 가져 오기가 실패하지 않음을 의미하지 않는다. 이는 * 두 * 모듈의 "본문"이 다른 모듈의 내용을 참조해야하는 경우에만 해당됩니다. 모듈 중 하나가 다른 모듈을 함수 정의 내에서만 사용하는 경우 (가져 오기 중에는 * 실행되지 않음) 안전합니다 (대부분의 경우 해당됩니다). 나쁜 경우에도, 다른 모듈이 필요로하는 것들을 먼저 정의하고 다른 모듈을'importing '함으로써 import 에러를 수정할 기회가있다. 그러나이 디자인은 아주 빨리 복잡해진다. – Bakuriu