Bir Python betiğinde biraz duvar içe aktaran modüllerle karşılaştım. Hatayı açıklamak için elimden gelenin en iyisini yapacağım, neden onunla karşılaştığımı ve neden problemimi çözmek için bu özel yaklaşımı bağladığımı (bunu bir saniye içinde açıklayacağım):
Bu yardımcı modülün içe aktarılacağı ad alanında tanımlanan varlıklara atıfta bulunan bazı yardımcı işlevler / sınıflar tanımladığım bir modülüm olduğunu varsayalım ("a" böyle bir varlık olsun):
modül1:
def f():
print a
Ve sonra, bu yardımcı programları içe aktarmak istediğim "a" nın tanımlandığı ana programım var:
import module1
a=3
module1.f()
Programın yürütülmesi aşağıdaki hatayı tetikleyecektir:
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
Geçmişte (iki gün önce) benzer sorular sorulmuş ve birkaç çözüm önerilmiştir, ancak bunların benim gereksinimlerime uyduğunu gerçekten düşünmüyorum. İşte benim özel bağlamım:
MySQL veritabanı sunucusuna bağlanan ve bir GUI ile verileri görüntüleyen / değiştiren bir Python programı yapmaya çalışıyorum. Temizlik uğruna, MySQL ile ilgili yardımcı / yardımcı işlevler grubunu ayrı bir dosyada tanımladım. Ancak hepsi Başlangıçta tanımlanmış olan ortak bir değişken var içeride kamu hizmetleri modülü ve hangi imleç MySQLdb modülünden nesnesi. Daha sonra, imleç nesnesinin (db sunucusuyla iletişim kurmak için kullanılan) ana modülde tanımlanması gerektiğini fark ettim , böylece hem ana modül hem de ona aktarılan her şey bu nesneye erişebilir.
Nihai sonuç şuna benzer bir şey olacaktır:
utilities_module.py:
def utility_1(args):
code which references a variable named "cur"
def utility_n(args):
etcetera
Ve ana modülüm:
program.py:
import MySQLdb, Tkinter
db=MySQLdb.connect(#blahblah) ; cur=db.cursor() #cur is defined!
from utilities_module import *
Ve sonra, herhangi bir yardımcı program işlevini çağırmaya çalışır çalışmaz, yukarıda bahsedilen "genel ad tanımlanmadı" hatasını tetikliyor.
Özel bir öneri, yardımcı programlar dosyasında aşağıdaki gibi bir "from program import cur" ifadesinin bulunmasıydı:
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 *
Ancak bu döngüsel içe aktarım veya bunun gibi bir şey ve sonuç olarak, o da çöküyor. Yani sorum şu:
Ana modülde tanımlanan "cur" nesnesini, içine aktarılan yardımcı fonksiyonlar tarafından nasıl görünür yapabilirim?
Zaman ayırdığınız için teşekkürler ve çözüm başka bir yere gönderildiyse en derin özür dilerim. Cevabı kendim bulamıyorum ve kitabımda başka numaram yok.
db
(ve cur
, eğer ısrar varsa) de bunun ayrı bir modüle program
ve utilities_module
buradan içe. Bu şekilde döngüsel bağımlılıkları (programın içe aktardığı modüllerden içe aktarma) ve bunlarla birlikte gelen kafa karışıklığını elde edemezsiniz.
fetch_all
iki listeden geçmek zorunda kalmadan ve yinelemeye gerek kalmadan ikisini kilit adımda yineleyebilirsiniz. veya iki farklı iş parçacığı / yeşillik / geri arama zinciri / veritabanını çakışmadan kullanan her ne olursa olsun).