Salah satu sumber kesulitan dengan pertanyaan ini adalah bahwa Anda memiliki sebuah program bernama bar/bar.py: import barimpor baik bar/__init__.pyatau bar/bar.py, tergantung di mana hal itu dilakukan, yang membuatnya sedikit rumit untuk melacak yang amerupakan bar.a.
Berikut cara kerjanya:
Kunci untuk memahami apa yang terjadi adalah dengan menyadari bahwa dalam __init__.py,
from bar import a
pada dasarnya melakukan sesuatu seperti
a = bar.a
# … where bar = bar/bar.py (as if bar were imported locally from __init__.py)
dan mendefinisikan variabel baru ( bar/__init__.py:a, jika Anda mau). Jadi, nama from bar import ain __init__.pymengikat Anda bar/__init__.py:ake bar.py:aobjek asli ( None). Inilah mengapa Anda dapat melakukannya from bar import a as a2di __init__.py: dalam kasus ini, jelas bahwa Anda memiliki keduanya bar/bar.py:adan nama variabel yang berbedabar/__init__.py:a2 (dalam kasus Anda, nama kedua variabel kebetulan saja keduanya a, tetapi mereka masih hidup di ruang nama yang berbeda: di __init__.py, mereka bar.adan a).
Sekarang, saat Anda melakukannya
import bar
print bar.a
Anda mengakses variabel bar/__init__.py:a(karena import barmengimpor Anda bar/__init__.py). Ini adalah variabel yang Anda ubah (menjadi 1). Anda tidak menyentuh isi variabel bar/bar.py:a. Jadi saat Anda selanjutnya melakukannya
bar.foobar()
Anda memanggil bar/bar.py:foobar(), yang mengakses variabel adari bar/bar.py, yang masih None(ketika foobar()ditentukan, itu mengikat nama variabel sekali dan untuk semua, jadi ain bar.pyadalah bar.py:a, bukan avariabel lain yang ditentukan dalam modul lain — karena mungkin ada banyak avariabel di semua modul yang diimpor ). Karenanya Nonekeluaran terakhir .
Kesimpulan: yang terbaik adalah menghindari ambiguitas apa pun import bar, dengan tidak memiliki bar/bar.pymodul apa pun (karena bar.__init__.pymembuat direktori sudah bar/menjadi paket, yang juga dapat Anda impor import bar).