[python] “import *”가 나쁜 이유는 무엇입니까?

import *파이썬 에서는 사용하지 않는 것이 좋습니다 .

누구든지 그 이유를 알려 주시면 다음에 그렇게하지 않도록 할 수 있습니까?



답변

  • 네임 스페이스에 많은 것들을 넣기 때문에 (이전 가져 오기에서 다른 객체를 음영 처리하고 알 수 없습니다).

  • 정확히 무엇을 가져올 지 모르고 어떤 모듈에서 어떤 모듈을 가져 왔는지 쉽게 찾을 수 없기 때문에 (가독성).

  • pyflakes코드에서 오류를 정적으로 감지하는 것과 같은 멋진 도구를 사용할 수 없기 때문 입니다.


답변

파이썬선에 따르면 :

암시적인 것보다 명시적인 것이 좋습니다.

… 논쟁 할 수 없어요?


답변

**locals()기능에 전달 하지 않습니까?

파이썬은 “포함”문이 부족하기 때문에 그리고self 매개 변수를 명시 적이며, 그리고 다른 모듈을 읽지 않고 어떤 종류없이 – 범위 지정 규칙은 매우 간단합니다, 그 목적은 어디에서 오는 변수에 손가락을 가리키고에게 매우 쉽게 보통이다 IDE의 (어쨌든 언어가 매우 역동적이라는 사실에 의해 조사 방법으로 제한됨).

import *모든 것이 깨집니다.

또한 버그를 숨길 수도 있습니다.

import os, sys, foo, sqlalchemy, mystuff
from bar import *

이제 bar 모듈에 ” os“, ” mystuff“등 … 속성이 있으면 명시 적으로 가져온 속성을 무시하고 매우 다른 것을 가리킬 수 있습니다. 정의 __all__암시 적으로 가져옵니다 무엇이 상태 – – 바에서 현명한 종종 있지만 개체를 읽고 바 모듈을 분석하고 따르지 않고, 어디에서 온 여전히 그것을 추적하기 어렵다 자사의 수입. 네트워크 import *는 프로젝트 소유권을 가질 때 가장 먼저 수정하는 것입니다.

나를 오해하지 마십시오. 만약 import *빠진 것이 있으면 울고 싶습니다. 그러나 신중하게 사용해야합니다. 좋은 사용 사례는 다른 모듈 위에 파사드 인터페이스를 제공하는 것입니다. 마찬가지로, 조건부 가져 오기 문을 사용하거나 함수 / 클래스 네임 스페이스 내에서 가져 오기를 사용하려면 약간의 훈련이 필요합니다.

나는 중대형 프로젝트 또는 여러 기여자가있는 작은 프로젝트에서 최소한의 pyflakes를 실행하거나 올바르게 구성된 pylint를 실행하는 정적 분석 측면에서 최소한의 위생이 필요하다고 생각합니다. 그들은 일어난다.

물론 이것은 파이썬이기 때문에 규칙을 어 기고 탐구해야하지만 소스 코드가 규율이 없으면 열 배가 될 수있는 프로젝트에주의하십시오. 문제가 될 것입니다.


답변

from ... import *대화식 세션에서 수행해도 됩니다.


답변

네임 스페이스를 오염시키기 때문입니다. 자신의 네임 스페이스에서 모든 함수와 클래스를 가져 오며, 정의한 함수와 충돌 할 수 있습니다.

또한 유지 관리 작업에는 정규화 된 이름을 사용하는 것이 더 명확하다고 생각합니다. 코드 라인 자체에서 함수의 출처를 알 수 있으므로 문서를 훨씬 쉽게 확인할 수 있습니다.

foo 모듈에서 :

def myFunc():
    print 1

귀하의 코드에서 :

from foo import *

def doThis():
    myFunc() # Which myFunc is called?

def myFunc():
    print 2


답변

http://docs.python.org/tutorial/modules.html

일반적으로 *모듈이나 패키지에서 가져 오는 방식은 코드를 잘 읽을 수 없기 때문에 눈살을 찌푸리게합니다 .


답변

foo라는 모듈에 다음 코드가 있다고 가정 해보십시오.

import ElementTree as etree

그런 다음 자신의 모듈에 다음이 있습니다.

from lxml import etree
from foo import *

이제하는 어려운 디버그 모듈이 같은 모습 이 거기에 LXML의 etree을 가지고,하지만 정말 대신 ElementTree 있습니다.