에 따르면 공식 문서 , os.path
모듈입니다. 따라서 가져 오기를 선호하는 방법은 무엇입니까?
# Should I always import it explicitly?
import os.path
또는…
# Is importing os enough?
import os
“수입 os
작품 “에 대답하지 마십시오 . 나는 그것이 지금도 나를 위해 작동한다는 것을 알고있다 (Python 2.6 현재). 내가 알고 싶은 것은이 문제에 대한 공식 권장 사항입니다. 따라서이 질문에 대한 답변이 있으면 참조 를 게시하십시오 .
답변
os.path
재미있는 방식으로 작동합니다. 것 같습니다 os
서브 모듈과 패키지해야 path
하지만, 현실 os
과 마술을하는 일반 모듈 sys.modules
주입은 os.path
. 다음과 같은 일이 발생합니다.
-
Python이 시작되면에 많은 모듈을로드합니다
sys.modules
. 스크립트의 어떤 이름에도 바인딩되지 않지만 어떤 방식 으로든 가져올 때 이미 작성된 모듈에 액세스 할 수 있습니다.sys.modules
어떤 모듈이 캐시되는지에 대한 내용입니다. 모듈을 가져올 때 이미 가져 오면 인스턴스가에 저장됩니다sys.modules
.
-
os
파이썬이 시작될 때로드되는 모듈 중 하나입니다.path
OS 고유의 경로 모듈에 속성을 지정합니다 . -
하위 모듈 인 것처럼
sys.modules['os.path'] = path
”import os.path
” 을 수행 할 수 있도록 주입 합니다.
내가 생각하는 경향 os.path
으로 내가 사용하고자하는 모듈 이 아닌 에서 일 os
모듈 그렇지 않은 순간에도, 정말 라는 패키지의 서브 모듈 os
, 나는 그것이 하나처럼의 종류를 가져오고 나는 항상import os.path
. 이것은 os.path
문서화 방법과 일치 합니다.
덧붙여 말하자면, 이런 종류의 구조는 모듈과 패키지 및 코드 구성에 대한 많은 파이썬 프로그래머의 초기 혼란을 초래한다고 생각합니다. 이것은 실제로 두 가지 이유입니다
-
os
패키지로 생각import os
하고 서브 모듈에 액세스os.path
할 수 있고 액세스 할 수 있다는 것을 알고 있다면 , 가져 오지 않고 수행 할 수없고import twisted
자동으로 액세스 할 때 나중에 놀라게 될 수 있습니다twisted.spread
. -
그것은
os.name
정상적인 것, 문자열이며os.path
모듈 이라는 것이 혼란 스럽습니다 . 나는 항상 패키지를 빈__init__.py
파일로 구성하여 같은 수준에서 항상 모듈 / 패키지 또는 다른 것들의 한 가지 유형을 갖습니다. 몇몇 큰 파이썬 프로젝트는이 접근 방식을 취하는데,보다 구조화 된 코드를 만드는 경향이 있습니다.
답변
에 따라 PEP-20 팀 피터스 (Tim Peters)에 의해, 그리고 “가독성 카운트” “노골적인 암시보다 낫다”. os
모듈 에서 필요한 모든 것이 아래 os.path
에 import os.path
있는 경우보다 명확하게 설명하고 다른 사람들에게 실제로 관심있는 사항을 알려주십시오.
마찬가지로, PEP-20은 또한 “단순이 복잡한 것보다 낫다”고 말합니다. 따라서보다 일반적인 os
우산 아래에있는 물건이 필요한 경우 import os
선호됩니다.
답변
확실한 답변 : import os
및 사용 os.path
. import os.path
직접 하지 마십시오 .
모듈 자체의 문서에서 :
>>> import os
>>> help(os.path)
...
Instead of importing this module directly, import os and refer to
this module as os.path. The "os.path" name is an alias for this
module on Posix systems; on other systems (e.g. Mac, Windows),
os.path provides the same operations in a manner specific to that
platform, and is an alias to another module (e.g. macpath, ntpath).
...
답변
흥미롭게도 os.path를 가져 오면 모든 os를 가져옵니다. 대화식 프롬프트에서 다음을 시도하십시오.
import os.path
dir(os)
os를 가져온 것처럼 결과가 동일합니다. os.path는 사용중인 운영 체제에 따라 다른 모듈을 참조하기 때문에 파이썬은 os를 가져와 경로에로드 할 모듈을 결정합니다.
일부 모듈의 경우 say import foo
가 노출되지 않으므로 foo.bar
특정 모듈의 디자인에 따라 달라집니다.
일반적으로 필요한 명시 적 모듈을 가져 오면 속도가 약간 빨라집니다. 내 컴퓨터에서 :
import os.path
: 7.54285810068e-06
초
import os
: 9.21904878972e-06
초
이시기는 무시할만한 수준에 가깝습니다. 프로그램은 os
지금 또는 나중에 다른 모듈을 사용해야 할 수도 있으므로 일반적으로 2 마이크로 초를 희생하고 import os
나중에이 오류를 피하기 위해 사용하는 것이 좋습니다. 나는 일반적으로 os를 전체적으로 가져 오는 것과 관련이 있지만, 일부는 import os.path
기술적으로 더 효율적인 것을 선호 하고 os
모듈 의 유일한 부분 인 코드 독자에게 전달 해야하는 이유를 알 수 있습니다. 그것은 본질적으로 내 생각에 스타일 질문으로 귀결됩니다.
답변
상식은 여기에서 작동합니다. os
모듈이고 os.path
모듈이기도합니다. 따라서 사용하려는 모듈을 가져 오십시오.
-
os
모듈 에서 기능을 사용하려면 을 가져 오십시오os
. -
os.path
모듈 에서 기능을 사용하려면 을 가져 오십시오os.path
. -
두 모듈 모두에서 기능을 사용하려면 두 모듈을 모두 가져 오십시오.
import os import os.path
참고로 :
-
Lib / idlelib / rpc.py 는 사용
os
하고 가져옵니다os
. -
Lib / idlelib / idle.py 는 사용
os.path
하고 가져옵니다os.path
. -
Lib / ensurepip / init .py 는 둘 다 사용하고 둘 다 가져옵니다.