2014-12-11 5 views
-1

일부 파이썬 코드를 읽는 동안 사용자 정의 모듈을 가져 오는 두 가지 방법이있었습니다.파이썬에서 모듈을 가져 오는 두 가지 방법의 차이점은 무엇입니까?

첫 번째 것;

import config 

두 번째 것;

from config import * 

둘 사이의 차이점은 무엇입니까? 두 줄의 코드가 모두 있으면 어떻게됩니까? 부작용은 없습니까?

+6

두 번째 방법은 구성에있는 거의 모든 항목으로 현재 네임 스페이스를 오염시킵니다. – Marcin

+0

@Marcin :이'config.variable'처럼 설정 모듈에서 선언 된 변수를 사용하고자 할 때,'from config import *'는 작동하지 않습니다. 이것은 큰 오염 물질이라 할지라도이 상황에서'import config'를 사용해야한다는 뜻입니까? 오염을 피할 수있는 더 좋은 방법이 있습니까? – user781486

+1

[python.org] (https://docs.python.org/2/tutorial/modules.html#importing-from-a- 패키지)에서 사용할 수있는 예제와 함께 꽤 괜찮은 문서가 있습니다. 아래 투표는 내 것이 아니지만이 정보가 널리 사용 가능하고 다른 곳에서 그 사람을 찾지 않는다고 말하면 투표를 할 수 있습니다. – Minnow

답변

4

전체 내용이 stack, overflow 인 모듈이 unicorn이라고 가정 해보십시오. 당신이 import unicorn을 할 경우

  • 는 이러한 unicorn.stack, unicorn.overunicorn.flow으로 액세스 할 수 있습니다.
  • import unicorn as U을 수행하는 경우 U.stack, U.overU.flow으로 액세스 할 수 있습니다.
  • from unicorn import stack을 수행하는 경우 의 stack 개체가 전역 변수 stack에 복사됩니다.
  • from unicorn import *을 입력하면 stack 및 모듈의 다른 모든 전역 개체 (이름이 밑줄로 시작하는 비공개 개체 제외)가 전역 이름 공간에 복사됩니다. 괜찮 으면 좋겠지 만 나중에 unicorn 모듈을 업데이트하면 프로그램이 예기치 않게 작동하는 원인이 될 수 있습니다. 예를 들어 userserver이라는 변수가있는 경우 super, user, serverfault을 추가하는 unicorn의 향후 업데이트로 인해 오작동 할 수 있습니다.
  • from unicorn import stack, over, flow을 입력하면 지정된 항목 만 복사되고 unicorn에 추가 된 후에도 프로그램이 계속 작동합니다.
  • from unicorn import stack as H을 수행하는 경우 모듈에서 stack이 표시되지만 프로그램의 전역 네임 스페이스에서는 H이됩니다. 특정 기능이나 변수를 자주 사용하는 경우 80 자 미만으로 줄을 유지하는 데 도움이 될 수 있습니다.
-1

당신이 그것을하는 방법을 사용하려는 경우

import config 

단지, 모듈 이름이 설정을 가져올 코드, 당신은 myname = config.getName() 같은 것을 사용해야합니다.

코드

from config import * 

는 현재 네임 스페이스에 config 보낸 모든 것을 가져옵니다. 이제 config에서 getName 메서드를 사용하려는 경우 코드는 myname = getName()

과 같습니다. 두 개 이상의 모듈에서 동일한 이름으로 다른 메서드를 사용할 수 있으므로 항상 첫 번째 가져 오기 방법을 사용합니다. 첫 번째 수입 코드에 의해 수입 한을 대체 두 번째 방법으로 작업을 수행 할 때

import config 
import mydata 

print config.getName()#print Jim 
print mydata.getName()#print Tom 

같은, 마지막으로 가져온 코드가 getName 방법을 가져옵니다 :

를 예를 들어, 우리는 아래의 두 getName 방법을 사용할 수 있습니다
from config import * 
from mydata import * 

print getName()#print Tom 

현재 네임 스페이스는 두 번째 방법으로 오염되어 있습니다.

+0

이것은 잘못되었습니다. 후자는'config'로 작동하지 않고'mydata'는 그 공간에 정의되어 있지 않습니다. 그것들은 아무 것도 출력하지 않을 것이고'print config.getName()'는 예외를 던질 것이다. –

+0

@LegoStormtroopr 미안하지만 코드를 복사하고 수정하지 마십시오. :( – tianwei

관련 문제