'x import a'대 'import x; XA '
-
06-07-2019 - |
문제
일부 Python 프로그래머가 다음 스타일을 상당히 일관되게 사용하는 것을 보았습니다 (스타일 1).
import some_module
# Use some_module.some_identifier in various places.
이 스타일을 지원하기 위해 "명시 적은 암시 적보다 낫다" 격언. 다른 프로그래머 가이 스타일을 사용하는 것을 보았습니다 (스타일 2).
from some_module import some_identifier
# Use some_identifier in various places.
내가 스타일 2에서 볼 수있는 주요 이점은 유지 가능성입니다. 오리 타이핑 이상적인 _other_module로 some_module을 교환하고 싶을 수도 있습니다. 나는 또한 스타일 2가 "가독성 계수" 격언. 나는 동의하지 않는 경향이 있지만, 항상 검색과 재구점이 첫 번째 스타일을 사용할 때 마찬가지로 좋은 옵션이라고 주장 할 수 있습니다.
부록: 당신이 사용할 수 있다는 것이 주목되었습니다 as
스위치를 해결합니다 some_module
에게 some_other_module
스타일 1. 나는 구현을 결정하는 것이 일반적이라고 언급하는 것을 잊었다. some_identifier
당신의 현재의 동등한 것으로 만들어진 모듈 some_module
컨테이너는 약간 어색합니다.
해결책
두 경우 모두에 용도가 있으므로 이것이 어느 정도 문제라고 생각하지 않습니다. 모듈에서 사용하는 것을 고려할 것입니다 import x,y,z
언제:
수입 할 것이 상당히 적습니다.
수입 된 기능의 목적은 모듈 이름과 이혼 할 때 분명합니다. 이름이 상당히 일반적이면 다른 사람들과 충돌하여 거의 말할 수 없습니다. 예를 들어. 봄
remove
조금 말해 주지만os.remove
아마도 당신이 파일을 다루고 있다는 것을 암시 할 것입니다.이름은 충돌하지 않습니다. 위와 유사하지만 더 중요합니다. 절대 다음과 같은 일을하십시오 :
from os import open
import module [as renamed_module]
사용할 때 호출되는 것에 대해 조금 더 많은 맥락을 제공한다는 이점이 있습니다. 모듈이 실제로 더 많은 정보를 제공하지 않을 때 이것이 조금 더 혼란스럽고 성능이 약간 덜 어수선한다는 단점이 있습니다 (1 대신 2 개의 조회).
그러나 테스트 할 때도 장점이 있습니다 (예 : 모든 모듈을 변경할 필요없이 OS.를 모의 객체로 교체 함).
import config
config.dburl = 'sqlite:///test.db'
의심스러운 경우, 나는 항상 함께 갈 것입니다 import module
스타일.
다른 팁
다음 구문의 존재로 :
import some_other_module as some_module
Style 2의 유지 관리 가능성은 더 이상 관련이 없습니다.
나는 스타일을 사용하는 경향이 있습니다. 일반적으로, 나는 일반적인 Python 프로그램에서 수입 패키지 이름을 몇 번만 명시 적으로 참조한다는 것을 알았습니다. 다른 모든 것은 객체의 메소드이며, 물론 가져온 패키지를 참조 할 필요가 없습니다.
나는 보통 임계 값을 사용하여 이것을 결정합니다. 내에서 많은 것을 사용하고 싶다면 some_module
, 나는 사용할 것이다 :
import some_module as sm
x = sm.whatever
한두 가지만 있으면 필요한 것입니다.
from some_module import whatever
x = whatever
그것은 내가 필요하지 않다고 가정합니다 whatever
~에서 some_other_module
, 물론이야.
나는 사용하는 경향이있다 as
입력을 줄일 수 있도록 가져 오기 조항 그리고 미래에 다른 모듈을 아주 쉽게 대체하십시오.
나는 선호한다 import X
그리고 사용하십시오 X.a
가능한 한 많이.
저의 예외는 Django와 같은 큰 프레임 워크에서 깊게 중첩 된 모듈을 중심으로합니다. 그들의 모듈 이름은 길어지는 경향이 있으며, 그 예는 모두 말합니다. from django.conf import settings
타이핑을 저장합니다 django.conf.settings.DEBUG
어디에나.
모듈 이름이 깊게 중첩 된 경우 예외는 사용하는 것입니다. from X.Y.Z import a
.
나는 그 표기법을 발견했다
from some_module import some_symbol
대부분의 경우 가장 잘 작동합니다. 또한 기호에 대한 이름 충돌의 경우 다음을 사용할 수 있습니다.
from some_module import some_symbol as other_symbol
질문에서 알 수 있듯이, 매번 모듈 이름을 다시 쓰는 것을 피합니다. 나는 구문을 사용합니다.
import module [as other_module]
두 경우에만 :
- 너무 많은 모듈 기능/객체를 사용하여 모두 가져옵니다.
- 모듈은 실행 중에 변경 될 수있는 일부 기호를 정의합니다.
나는 개인적으로 내 네임 스페이스를 너무 많이 엉망으로 만들지 않으려 고합니다. 그래서 대부분의 상황에서 나는 그냥
import module
또는 모듈을 모드로 가져옵니다
진짜 차이만이 많이 사용되는 단일 클래스가있는 모듈이있을 때입니다. 내가 서브 클래스를 사용했다면 a list
유형을 입력하여 기능을 추가하려면 사용할 것입니다
from SuperImprovedListOverloadedWithFeatures import NewLIst
nl = NewList()
등.
각 모듈의 멤버 만 사용하는 경향이 있으므로 많은
from john import cleese
from terry import jones, gilliam
내 코드에서. 전체 모듈을 가져 오겠습니다 (예 : os
또는 wx
) 대부분의 모듈을 사용하고 모듈 이름이 짧은 경우. 이름 충돌이 있거나 독자에게 해당 함수가 관련된 내용을 상기시키려면 전체 모듈을 가져옵니다.
import michael
import sarah
import wave
gov_speech = wave.open(sarah.palin.speechfile)
parrot_sketch = wave.open(michael.palin.justresting)
(사용할 수 있습니다 from wave import open as wave_open
, 그러나 나는 그것을 알아 낸다 wave.open
독자에게 더 친숙 할 것입니다.
스택 오버 플로우 질문에 관심이있을 수 있습니다 왜 'import x; xy'가 'x import y'에서 'x import y'와 다르게 행동하고, 첫 번째는 패키지 x에서 실패합니까?이니 완료되지 않았습니까?.
나는 최신 버전의 파이썬을 믿습니다 (2.5+? 내 사실을 확인해야합니다 ...) 할 수 있습니다.
import some_other_module as some_module
따라서 스타일 1과 함께 가서 나중에 다른 모듈로 교체 할 수 있습니다.
나는 그것이 일반적으로 당신의 네임 스페이스를 얼마나 혼란스럽게하고 싶은지에 대한지도를 생각합니다. 모듈에서 하나 또는 두 개의 이름을 사용 하시겠습니까? 또는 그들 모두 (from x import *
모두가 나쁘지는 않지만 일반적으로)?