Napotkałem trochę ściany importującej moduły w skrypcie Pythona. Zrobię co w mojej mocy, aby opisać błąd, dlaczego na niego wpadam i dlaczego wiążę to szczególne podejście, aby rozwiązać mój problem (który opiszę za chwilę):
Załóżmy, że mam moduł, w którym zdefiniowałem kilka funkcji / klas narzędzi, które odnoszą się do jednostek zdefiniowanych w przestrzeni nazw, do której ten moduł pomocniczy zostanie zaimportowany (niech „a” będzie taką jednostką):
moduł 1:
def f():
print a
Następnie mam program główny, w którym zdefiniowano „a”, do którego chcę zaimportować te narzędzia:
import module1
a=3
module1.f()
Uruchomienie programu wywoła następujący błąd:
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
Podobne pytania zadawano już w przeszłości (dwa dni temu, d'uh) i zasugerowano kilka rozwiązań, jednak nie sądzę, aby pasowały one do moich wymagań. Oto mój szczególny kontekst:
Próbuję stworzyć program w języku Python, który łączy się z serwerem bazy danych MySQL i wyświetla / modyfikuje dane za pomocą GUI. Ze względu na czystość zdefiniowałem kilka pomocniczych / narzędziowych funkcji związanych z MySQL w osobnym pliku. Jednak wszystkie mają wspólną zmienną, którą pierwotnie zdefiniowałem w module narzędzi, a która jest obiektem kursora z modułu MySQLdb. Później zdałem sobie sprawę, że obiekt kursora (który jest używany do komunikacji z serwerem db) powinien być zdefiniowany w module głównym, tak aby zarówno moduł główny, jak i wszystko, co jest do niego importowane, miało dostęp do tego obiektu.
Wynik końcowy wyglądałby mniej więcej tak:
utilities_module.py:
def utility_1(args):
code which references a variable named "cur"
def utility_n(args):
etcetera
I mój główny moduł:
program.py:
import MySQLdb, Tkinter
db=MySQLdb.connect(#blahblah) ; cur=db.cursor() #cur is defined!
from utilities_module import *
A potem, gdy tylko spróbuję wywołać którąkolwiek z funkcji narzędziowych, wyzwala wspomniany wyżej błąd „nie zdefiniowano nazwy globalnej”.
Szczególną sugestią było umieszczenie w pliku narzędzi instrukcji „from program import import cur”, na przykład:
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 *
Ale to cykliczny import lub coś w tym rodzaju i, podsumowanie, też się zawiesza. Więc moje pytanie brzmi:
Jak u diabła mogę sprawić, by obiekt "cur", zdefiniowany w głównym module, był widoczny dla tych funkcji pomocniczych, które są do niego importowane?
Dziękuję za poświęcony czas i najgłębsze przeprosiny, jeśli rozwiązanie zostało opublikowane w innym miejscu. Po prostu nie mogę sam znaleźć odpowiedzi i nie mam więcej sztuczek w mojej książce.
db
(i cur
, jeśli nalegasz) w osobnym module, że zarówno program
i utilities_module
zaimportować go z. W ten sposób nie otrzymujesz zależności cyklicznych (importowanie programu z modułów, które program importuje) i zamieszania, które się z nimi wiążą.
fetch_all
przechodzić przez dwie listy) , lub po prostu możesz mieć dwa różne wątki / greenlety / łańcuchy wywołań zwrotnych / cokolwiek korzystającego z bazy danych bez konfliktów).