2013-04-10 1 views
6

저는 ~ 30 명의 개발자 팀을위한 파이썬 코딩 가이드 라인을 작성하고 있습니다. 내 문서의 기초로서, 지금까지 Google python style guidePEP 8 style guide을 연구했으며 두 가지 모두에서 정보를 통합했습니다.파이썬에서 클래스 가져 오기와 클래스 모듈 가져 오기의 장단점은 무엇입니까?

Google 스타일 가이드가 PEP 8보다 더 제한적인 곳은 가져 오기입니다. Google 가이드는 개발자에게 패키지 및 모듈 만 가져 오기를 요청한 다음 더 적합한 이름으로 된 항목을 참조하도록 요청합니다. 예 :

from pkg import module 
... 
my_class = module.MyClass() 

"각 식별자의 출처가 일관된 방식으로 표시됩니다"는 정당성이 있습니다. 우리 프로젝트에서는 2 ~ 3 단계의 패키지로 구성하려고하므로 식별자의 전체 소스를 알기 위해 어쨌든 import 문을 검사해야 할 것입니다. 나는 "선호하는 스타일"로 수입이 스타일을 옹호하고 싶습니다 :

from pkg.module import MyClass 
... 
my_class = MyClass() 

IMHO, 이름이 더 간결 때 개선 등의 지능형리스트 파이썬 구조의 가독성을.

불투명 한 점은 파이썬 인터프리터가 무대 뒤에서 할 수있는 일입니다. 예를 들어 MyClass가 이제이 모듈과이 모듈의 모든 수입업자에 대한 전역 네임 스페이스의 일부입니까? (이것은 좋지 않을 것이고, 이상한 버그로 이어질 수 있으며, 이것이 사실이라면 나는 Google 스타일을지지 할 것이다).

파이썬 개발 경험이 약 6 개월로 제한되어 있으며 (컨설팅 프로젝트에 대한 전문가가 많지 않기 때문에) 커뮤니티에서 더 많은 정보를 얻고 싶었습니다. 여기에 이미 연구 한 일부 항목은 다음과 같습니다

effbot - discussion on imports

stack overflow - import vs. from import

python documentation - modules

python documentation - import

이 답변 주셔서 감사합니다!

+3

* 직접 참조 할 수있는 것은 모듈의 전역입니다. MyClass는 두 번째 예제에서 실제로 전역이며, 첫 번째 모듈은 모듈입니다. –

+0

나는'import blah'와'vlah = blah.vlah'를합니다. 왜냐하면 내가'blah import vlah'를했을지라도 전체 모듈'blah'가 처리 될 것이기 때문입니다. – thkang

+0

Martijn이 대답 한 글로벌 질문 외에도 다른 것을 찾고 있습니까? 그렇다면 질문을 더 명확하게 할 수 있습니까? – msw

답변

5

파이썬에서는 둘 이상의 모듈에서 전역 변수 인 것은 없습니다. from pkg.module import MyClass을 수행하는 경우 MyClass은 모듈의 전역 네임 스페이스에 있지만 다른 모듈 (MyClass를 가져 오는 모듈을 가져 오는 모듈 포함)에는 포함되지 않습니다.

더 일반적인 질문에 대해서는 두 가지 가져 오기 메커니즘이 상황에 따라 허용 될 수 있습니다.

# Awkward 
from package import reallylongmodule 
reallylongmodule.MyClass() 

# Less awkward 
from package import reallylongmodule as rlm 
rlm.MyClass() 

클래스 이름은 그것에서 유래와 위치를 확인할 수있을만큼 독특한 경우 괜찮을 수 있습니다 단지 클래스를 가져 오기 : 모듈 이름이 긴 경우 다른 이름으로 가져 와서 일부 단축를 얻을 수 있습니다 그것이 무엇인지. 그러나 상대적으로 까다로운 이름 (예 : "Processor", "Unit", "Data", "Manager")을 가진 클래스를 정의하는 모듈이 여러 개있는 경우에는 모듈 이름을 통해 액세스하여 모듈에 액세스하는 것이 좋습니다 네가하는 일.

스타일 가이드는 궁극적으로 가이드가 아니며 법률이 아닙니다. 필자가 선호하는 것은 선명도와 가독성을 극대화하는 메커니즘을 선택하는 것입니다. 그것은 길고 성가신 이름을 피하는 것과 짧고 모호하거나 비밀스러운 이름을 피하는 것 사이의 절충안을 포함합니다.이 절충안을 만드는 방법은 사용중인 특정 라이브러리 및 사용 방법 (예 : 가져온 모듈의 수, 가져 오는 모듈의 수)에 따라 다릅니다.

+0

동의! 나는 어느 쪽의 스타일도 OK 다라고 생각한다. 클래스 (또는 함수)를 직접 가져 오는 것과 관련된 미묘한 함축이 있음을 더 많이 걱정했습니다. – Tom

0

코드 가이드를 작성하는 대신 pylint, pep8, pyflakes와 같은 자동 코드 검사기를 사용하는 것이 좋습니다.

개인적으로 가능한 이름 충돌 때문에 from pkg import module을 사용하는 것을 선호합니다.

from package import module 

def my_fun(): 
    module.function() 

Inpreter는 3 개의 해시 테이블 조회 로컬 함수 네임 스페이스, 현재 모듈의 전역 네임 스페이스 및 가져온 모듈의 네임 스페이스를 수행해야합니다.

from package.module import function 

def my_fun(): 
    function() 

에서 만 2 조회를 할 것입니다 : 수입 시간에 마지막으로 수행 한.

+0

자동 코드 검사기 사용에 동의합니다. 고객이 문서를 요구해야합니다. 나는 아마 그 지침 항목을 만들거야! – Tom

관련 문제