Я наткнувся на трохи модулів, що імпортують стіни в сценарії 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 *
І тоді, як тільки я намагаюся викликати будь-яку з функцій утиліт, вона спрацьовує вищезгаданою помилкою "глобальне ім'я не визначено".
Конкретна пропозиція полягала в тому, щоб у файлі утиліт містити оператор "from cur import import", наприклад такий:
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
повторити і повторити два списки , або просто так, ви можете мати дві різні нитки / greenlets / callback-ланцюги / що б там не було, використовуючи базу даних без конфліктів).