이 질문에 어려움 중 하나는 소스라는 이름의 프로그램을 가지고있다 bar/bar.py
: import bar
수입하거나 bar/__init__.py
또는 bar/bar.py
이 조금 성가신를 추적 할 수있는 완료 위치에 따라 a
입니다 bar.a
.
작동 방식은 다음과 같습니다.
무슨 일이 일어나는지 이해하는 열쇠는 당신의 __init__.py
,
from bar import a
사실상 다음과 같은 일을한다
a = bar.a
# … where bar = bar/bar.py (as if bar were imported locally from __init__.py)
새 변수를 정의합니다 ( bar/__init__.py:a
원하는 경우). 따라서 from bar import a
in __init__.py
은 이름 bar/__init__.py:a
을 원래 bar.py:a
개체 ( None
) 에 바인딩 합니다 . 당신이 할 수있는 이유입니다 from bar import a as a2
에서 __init__.py
:이 경우, 당신이 모두있는 것이 분명 bar/bar.py:a
하고 뚜렷한 변수 이름 bar/__init__.py:a2
귀하의 경우를 (두 변수의 이름은 둘 다 될 일이 a
,하지만 여전히 라이브 서로 다른 네임 스페이스에서 그들은 :에 __init__.py
, 그들은 bar.a
및 a
)입니다.
이제 할 때
import bar
print bar.a
변수에 액세스하고 있습니다 bar/__init__.py:a
(을 import bar
가져 오기 때문에 bar/__init__.py
). 이것은 수정하는 변수입니다 (1로). 변수의 내용을 건드리지 않습니다 bar/bar.py:a
. 그래서 나중에 할 때
bar.foobar()
당신이 전화를 bar/bar.py:foobar()
변수에 액세스하는, a
에서 bar/bar.py
여전히있는이 None
때 ( foobar()
정의되는, 그래서 그것은, 한 번 모든 변수 이름을 결합 a
에서이 bar.py
있다 bar.py:a
다른, 아니 a
많은이있을 수 있습니다 또 다른 정의 변수 모듈이-로 a
가져온 모든 모듈의 변수 ). 따라서 마지막 None
출력입니다.
결론 : 그것은 어떤 모호성을 피하기 위해 최선 import bar
에 의해, 아니 어떤 데 bar/bar.py
(이후 모듈 bar.__init__.py
차종 디렉토리를 bar/
당신도 함께 가져올 수있는, 패키지 이미 import bar
).