ฉันได้พบกับโมดูลการนำเข้ากำแพงในสคริปต์ Python ฉันจะพยายามอย่างดีที่สุดเพื่ออธิบายข้อผิดพลาดเหตุใดฉันจึงพบปัญหาและเหตุใดฉันจึงผูกแนวทางเฉพาะนี้เพื่อแก้ปัญหาของฉัน (ซึ่งฉันจะอธิบายในไม่กี่วินาที):
สมมติว่าฉันมีโมดูลที่ฉันได้กำหนดฟังก์ชัน / คลาสยูทิลิตี้บางอย่างซึ่งอ้างถึงเอนทิตีที่กำหนดไว้ในเนมสเปซที่จะนำเข้าโมดูลเสริมนี้ (ให้ "a" เป็นเอนทิตีดังกล่าว):
โมดูล 1:
def f():
print a
จากนั้นฉันก็มีโปรแกรมหลักโดยที่ "a" ถูกกำหนดซึ่งฉันต้องการนำเข้ายูทิลิตี้เหล่านั้น:
import module1
a=3
module1.f()
การดำเนินการโปรแกรมจะทำให้เกิดข้อผิดพลาดต่อไปนี้:
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
มีการถามคำถามที่คล้ายกันในอดีต (เมื่อสองวันก่อน d'uh) และมีการแนะนำวิธีแก้ปัญหาหลายวิธี แต่ฉันไม่คิดว่าสิ่งเหล่านี้ตรงกับความต้องการของฉัน นี่คือบริบทเฉพาะของฉัน:
ฉันกำลังพยายามสร้างโปรแกรม Python ที่เชื่อมต่อกับเซิร์ฟเวอร์ฐานข้อมูล MySQL และแสดง / แก้ไขข้อมูลด้วย GUI เพื่อความสะอาดฉันได้กำหนดฟังก์ชันที่เกี่ยวข้องกับ MySQL เสริม / ยูทิลิตี้ไว้ในไฟล์แยกต่างหาก อย่างไรก็ตามพวกเขาทั้งหมดมีตัวแปรทั่วไปซึ่งฉันเคยกำหนดไว้ในโมดูลยูทิลิตี้และเป็นเคอร์เซอร์วัตถุจากโมดูล MySQLdb ฉันรู้ในภายหลังว่าวัตถุเคอร์เซอร์ (ซึ่งใช้สื่อสารกับเซิร์ฟเวอร์ db) ควรถูกกำหนดไว้ในโมดูลหลักเพื่อให้ทั้งโมดูลหลักและสิ่งใดก็ตามที่นำเข้ามาในนั้นสามารถเข้าถึงวัตถุนั้นได้
ผลลัพธ์สุดท้ายจะเป็นดังนี้:
utilities_module.py:
def utility_1(args):
code which references a variable named "cur"
def utility_n(args):
etcetera
และโมดูลหลักของฉัน:
program.py:
import MySQLdb, Tkinter
db=MySQLdb.connect(#blahblah) ; cur=db.cursor() #cur is defined!
from utilities_module import *
จากนั้นทันทีที่ฉันพยายามเรียกใช้ฟังก์ชันยูทิลิตี้ใด ๆ มันจะทำให้เกิดข้อผิดพลาด "global name not defined" ดังกล่าวข้างต้น
ข้อเสนอแนะเฉพาะคือให้มีคำสั่ง "from program import cur" ในไฟล์ยูทิลิตี้เช่นนี้:
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 *
แต่นั่นคือการนำเข้าแบบวนรอบหรืออะไรทำนองนั้นและบรรทัดล่างสุดก็ขัดข้องเช่นกัน ดังนั้นคำถามของฉันคือ:
ฉันจะทำให้วัตถุ "cur" ที่กำหนดไว้ในโมดูลหลักปรากฏแก่ฟังก์ชันเสริมที่นำเข้ามาในนรกได้อย่างไร
ขอขอบคุณที่สละเวลาและขออภัยอย่างสุดซึ้งหากมีการโพสต์วิธีแก้ปัญหาไว้ที่อื่น ฉันไม่สามารถหาคำตอบได้ด้วยตัวเองและฉันไม่มีกลเม็ดอื่น ๆ ในหนังสือของฉัน
db
(และcur
ถ้าคุณยืนยัน) ไปยังโมดูลแยกต่างหากที่ทั้งสองprogram
และutilities_module
นำเข้าจาก ด้วยวิธีนี้คุณจะไม่ได้รับการอ้างอิงแบบวงกลม (การนำเข้าโปรแกรมจากโมดูลที่โปรแกรมนำเข้า) และความสับสนที่มาพร้อมกับพวกเขา
fetch_all
ทำซ้ำสองรายการแทน หรือเพียงแค่นั้นคุณสามารถมีสองเธรด / กรีนเลต / การเรียกกลับโซ่ / อะไรก็ตามที่ใช้ฐานข้อมูลโดยไม่มีข้อขัดแย้ง)