Saya telah mengalami sedikit modul pengimpor dinding dalam skrip Python. Saya akan melakukan yang terbaik untuk menjelaskan kesalahan tersebut, mengapa saya mengalaminya, dan mengapa saya menggunakan pendekatan khusus ini untuk menyelesaikan masalah saya (yang akan saya jelaskan sebentar lagi):
Misalkan saya memiliki modul di mana saya telah mendefinisikan beberapa fungsi / kelas utilitas, yang merujuk ke entitas yang ditentukan dalam namespace tempat modul tambahan ini akan diimpor (misalkan "a" menjadi entitas seperti itu):
modul 1:
def f():
print a
Dan kemudian saya memiliki program utama, di mana "a" didefinisikan, di mana saya ingin mengimpor utilitas tersebut:
import module1
a=3
module1.f()
Menjalankan program akan memicu kesalahan berikut:
Traceback (most recent call last):
File "Z:\Python\main.py", line 10, in <module>
module1.f()
File "Z:\Python\module1.py", line 3, in f
print a
NameError: global name 'a' is not defined
Pertanyaan serupa telah diajukan di masa lalu (dua hari yang lalu, d'uh) dan beberapa solusi telah disarankan, namun menurut saya ini tidak sesuai dengan kebutuhan saya. Inilah konteks khusus saya:
Saya mencoba membuat program Python yang terhubung ke server database MySQL dan menampilkan / memodifikasi data dengan GUI. Demi kebersihan, saya telah mendefinisikan sekumpulan fungsi bantu / utilitas terkait MySQL dalam file terpisah. Namun mereka semua memiliki variabel umum, yang awalnya saya tentukan di dalam modul utilitas, dan yang merupakan objek kursor dari modul MySQLdb. Saya kemudian menyadari bahwa objek kursor (yang digunakan untuk berkomunikasi dengan server db) harus didefinisikan dalam modul utama, sehingga modul utama dan apa pun yang diimpor ke dalamnya dapat mengakses objek itu.
Hasil akhirnya akan seperti ini:
utilities_module.py:
def utility_1(args):
code which references a variable named "cur"
def utility_n(args):
etcetera
Dan modul utama saya:
program.py:
import MySQLdb, Tkinter
db=MySQLdb.connect(#blahblah) ; cur=db.cursor() #cur is defined!
from utilities_module import *
Dan kemudian, segera setelah saya mencoba memanggil salah satu fungsi utilitas, ini memicu kesalahan "nama global tidak ditentukan" yang disebutkan di atas.
Saran khusus adalah memiliki pernyataan "from program import cur" di file utilitas, seperti ini:
utilities_module.py:
from program import cur
#rest of function definitions
program.py:
import Tkinter, MySQLdb
db=MySQLdb.connect(#blahblah) ; cur=db.cursor() #cur is defined!
from utilities_module import *
Tapi itu impor siklik atau sesuatu seperti itu dan, intinya, itu macet juga. Jadi pertanyaan saya adalah:
Bagaimana saya bisa membuat objek "cur", yang didefinisikan dalam modul utama, terlihat oleh fungsi tambahan yang diimpor ke dalamnya?
Terima kasih atas waktu Anda dan permintaan maaf saya yang terdalam jika solusinya telah diposting di tempat lain. Saya tidak bisa menemukan jawabannya sendiri dan saya tidak punya trik lagi di buku saya.
db
(dan cur
, jika Anda bersikeras) ke modul terpisah yang keduanya program
dan utilities_module
impor darinya. Dengan cara itu Anda tidak mendapatkan dependensi melingkar (mengimpor program dari modul yang diimpor oleh program) dan kebingungan yang menyertainya.
fetch_all
dan beralih melalui dua daftar sebagai gantinya , atau agar Anda dapat memiliki dua utas / greenlets / callback-chains / apa pun yang berbeda menggunakan database tanpa konflik).