Tôi đã gặp một chút rắc rối khi nhập các mô-đun trong một tập lệnh Python. Tôi sẽ cố gắng hết sức để mô tả lỗi, lý do tại sao tôi gặp phải nó và tại sao tôi buộc cách tiếp cận cụ thể này để giải quyết vấn đề của mình (tôi sẽ mô tả trong giây lát):
Giả sử tôi có một mô-đun trong đó tôi đã xác định một số chức năng / lớp tiện ích, tham chiếu đến các thực thể được xác định trong không gian tên mà mô-đun phụ trợ này sẽ được nhập vào (giả sử "a" là một thực thể như vậy):
mô-đun 1:
def f():
print a
Và sau đó tôi có chương trình chính, trong đó "a" được định nghĩa, mà tôi muốn nhập các tiện ích đó vào:
import module1
a=3
module1.f()
Việc thực thi chương trình sẽ gây ra lỗi sau:
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
Những câu hỏi tương tự đã được hỏi trong quá khứ (hai ngày trước, d'uh) và một số giải pháp đã được đề xuất, tuy nhiên tôi không thực sự nghĩ rằng những giải pháp này phù hợp với yêu cầu của tôi. Đây là bối cảnh cụ thể của tôi:
Tôi đang cố gắng tạo một chương trình Python kết nối với máy chủ cơ sở dữ liệu MySQL và hiển thị / sửa đổi dữ liệu bằng GUI. Vì lợi ích của sự sạch sẽ, tôi đã xác định một loạt các chức năng phụ trợ / tiện ích liên quan đến MySQL trong một tệp riêng biệt. Tuy nhiên, tất cả chúng đều có một biến chung, mà tôi đã xác định ban đầu bên trong mô-đun tiện ích và là đối tượng con trỏ từ mô-đun MySQLdb. Sau đó, tôi nhận ra rằng đối tượng con trỏ (được sử dụng để giao tiếp với máy chủ db) nên được xác định trong mô-đun chính, để cả mô-đun chính và bất kỳ thứ gì được nhập vào nó đều có thể truy cập đối tượng đó.
Kết quả cuối cùng sẽ như thế này:
tiện ích_module.py:
def utility_1(args):
code which references a variable named "cur"
def utility_n(args):
etcetera
Và mô-đun chính của tôi:
program.py:
import MySQLdb, Tkinter
db=MySQLdb.connect(#blahblah) ; cur=db.cursor() #cur is defined!
from utilities_module import *
Và sau đó, ngay khi tôi cố gắng gọi bất kỳ chức năng tiện ích nào, nó sẽ gây ra lỗi "tên toàn cục không được xác định" nói trên.
Một gợi ý cụ thể là có câu lệnh "from program import cur" trong tệp tiện ích, chẳng hạn như sau:
tiện ích_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 *
Nhưng đó là nhập theo chu kỳ hoặc một cái gì đó tương tự và điểm mấu chốt, nó cũng bị lỗi. Vì vậy, câu hỏi của tôi là:
Làm thế quái nào mà tôi có thể làm cho đối tượng "cur", được xác định trong mô-đun chính, hiển thị với các chức năng phụ trợ được nhập vào nó?
Cảm ơn thời gian của bạn và lời xin lỗi sâu sắc nhất của tôi nếu giải pháp đã được đăng ở nơi khác. Tôi chỉ không thể tự mình tìm ra câu trả lời và tôi không còn thủ thuật nào trong cuốn sách của mình.
db
(và cur
, nếu bạn nhấn mạnh) vào một mô-đun riêng biệt program
và utilities_module
nhập nó từ đó. Bằng cách đó, bạn không nhận được các phụ thuộc vòng tròn (nhập chương trình từ các mô-đun mà chương trình nhập) và sự nhầm lẫn đi kèm với chúng.
fetch_all
lặp đi lặp lại hai danh sách hoặc chỉ để bạn có thể có hai luồng khác nhau / greenlets / callback-chain / bất cứ thứ gì bằng cách sử dụng cơ sở dữ liệu mà không có xung đột).