2016-08-12 3 views
5

from foo import barimport foo.bar as bar의 차이점은 무엇입니까?Python 가져 오기에 대한 설명

파이썬 네임 스페이스와 범위가 관련된 한 어떤 차이점이 있습니까? bar (예 : whatever이라는 함수)을 사용하려면 두 방법 중 하나를 사용하여 bar.whatever()이라고 부릅니다.

내가 작업하고있는 코드베이스에서 두 가지 스타일의 가져 오기를 모두 볼 수 있으며 어떤 차이가 있는지, 그리고 더 많은 "Pythonic"접근 방식으로 간주 될 수 있는지 궁금합니다.

다음
# foo.py 
bar = object() 

from foo import bar 파이썬에서 정상 것이지만, import foo.bar as barImportError: No module named bar을 올릴 것 : 바 모듈이없는 경우

답변

4

거기 foo 패키지 내부에 bar 모듈 또는 패키지가있는 경우 모두, 차이, 그리고 bar 경우 모든에서 하지 않는 모듈입니다.

고려 다음 foo 패키지 다음 __init__.py 파일이 전역 이름 bar너무을 정의

foo/ 
    __init__.py 
    bar.py 

경우, 그 첫 번째 예는 객체 를 가져옵니다. 두 번째 예에서는 bar.py 모듈을 가져옵니다. foo.bar 모듈을 가져 오면

그러나, 파이썬 수입 기계 __init__.py에있는 기존 bar 세계를 대체 foo 패키지의 이름 bar을 설정합니다 :

$ ls -1 foo/ 
__init__.py 
bar.py 
$ cat foo/__init__.py 
bar = 'from the foo package' 
$ cat foo/bar.py 
baz = 'from the foo.bar module' 
$ python 
Python 2.7.12 (default, Aug 3 2016, 18:12:10) 
[GCC 4.2.1 Compatible Apple LLVM 7.3.0 (clang-703.0.31)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> from foo import bar 
>>> bar 
'from the foo package' 
>>> import foo.bar as bar 
>>> bar 
<module 'foo.bar' from 'foo/bar.pyc'> 
>>> bar.baz 
'from the foo.bar module' 
>>> from foo import bar 
>>> bar 
<module 'foo.bar' from 'foo/bar.pyc'> 

다른 경우가있는 곳입니다 아니요bar.py 하위 모듈이 있습니다. foo은 패키지이거나 간단한 모듈 일 수 있습니다. 이 경우 from foo import bar 항상 foo 모듈의 객체를 찾을 것이며, import foo.bar as bar는 항상 실패합니다

$ cat foo.py 
bar = 'from the foo module' 
$ python 
Python 2.7.12 (default, Aug 3 2016, 18:12:10) 
[GCC 4.2.1 Compatible Apple LLVM 7.3.0 (clang-703.0.31)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import foo 
>>> foo.bar 
'from the foo module' 
>>> from foo import bar 
>>> bar 
'from the foo module' 
>>> import foo.bar as bar 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ImportError: No module named bar 

참고 가져 오기가 성공적으로 모든 경우에, 당신은 뭔가에 바인딩 전역 이름 bar으로 끝날 것을, 모듈의 객체 또는 모듈 객체.

5

는 큰 차이가 있습니다.

일반적으로 우리는 이름을 별명으로 사용하기 위해 "as"구문만을 사용합니다. 가독성을 높이기 위해 이름에 컨텍스트를 추가하거나 다른 이름과의 충돌을 피하기 위해서입니다.

관련 문제