Bu soru ile zorluk kaynaklarından biri adlı bir program var olmasıdır bar/bar.py
: import bar
ithalat ya bar/__init__.py
ya bar/bar.py
da biraz hantal hangi izlemek için yapar yapılır yere bağlı olarak a
ise bar.a
.
Şu şekilde çalışır:
Ne anlamanın anahtarı Gözlerinde farklı olduğunu fark etmektir __init__.py
,
from bar import a
aslında şöyle bir şey yapar
a = bar.a
ve yeni bir değişken tanımlar ( bar/__init__.py:a
isterseniz). Böylece, from bar import a
in __init__.py
adınız bar/__init__.py:a
orijinal bar.py:a
nesneye ( None
) bağlanır . Yapabileceğiniz Bu yüzden from bar import a as a2
de __init__.py
: bu durumda, bu durum sizin de sahip olduğu açıktır bar/bar.py:a
ve bir ayrı değişken adı bar/__init__.py:a2
sizin durumunuzda (iki değişken isimleri sadece ikisi olarak gerçekleşmesi a
, ama yine de canlı farklı ad alanlarında bunlar: Giriş __init__.py
, onlar bar.a
ve a
).
Şimdi, ne zaman yaparsan
import bar
print bar.a
değişkene erişiyorsunuz bar/__init__.py:a
(çünkü import bar
sizin değişkeninizi içe aktarıyor bar/__init__.py
). Bu, değiştirdiğiniz değişkendir (1'e). Değişkenin içeriğine dokunmuyorsunuz bar/bar.py:a
. Yani daha sonra yaptığında
bar.foobar()
Aradığınızda bar/bar.py:foobar()
değişken erişen hangi a
den bar/bar.py
hala hangi None
zaman ( foobar()
tanımlanmaktadır böylece, bu, ilk ve son olarak değişken isimleri bağlayan a
içinde bar.py
olan bar.py:a
herhangi bir başka değil, a
çok var olabilecek başka tanımlanan değişken modül-olarak a
tüm ithal modüllerde değişkenleri ). Dolayısıyla son None
çıktı.
Sonuç: herhangi bir karışıklıkları önlemek en iyisidir import bar
tarafından, değil herhangi sahip bar/bar.py
(beri modülü bar.__init__.py
markaları dizinine bar/
da içe ki, bir paket zaten import bar
).