Me encontré con un poco de un muro al importar módulos en un script de Python. Haré todo lo posible para describir el error, por qué me encuentro con él y por qué estoy vinculando este enfoque en particular para resolver mi problema (que describiré en un segundo):
Supongamos que tengo un módulo en el que he definido algunas funciones / clases de utilidad, que se refieren a entidades definidas en el espacio de nombres en el que se importará este módulo auxiliar (sea "a" una entidad de este tipo):
módulo 1:
def f():
print a
Y luego tengo el programa principal, donde se define "a", en el que quiero importar esas utilidades:
import module1
a=3
module1.f()
La ejecución del programa provocará el siguiente error:
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
Se han hecho preguntas similares en el pasado (hace dos días, uh) y se han sugerido varias soluciones, sin embargo, no creo que se ajusten a mis requisitos. Aquí está mi contexto particular:
Estoy tratando de crear un programa Python que se conecte a un servidor de base de datos MySQL y muestre / modifique datos con una GUI. En aras de la limpieza, he definido el grupo de funciones auxiliares / utilitarias relacionadas con MySQL en un archivo separado. Sin embargo, todos tienen una variable común, que había definido originalmente dentro del módulo de utilidades, y que es el objeto cursor del módulo MySQLdb. Más tarde me di cuenta de que el objeto cursor (que se usa para comunicarse con el servidor de base de datos) debe definirse en el módulo principal, de modo que tanto el módulo principal como cualquier cosa que se importe en él puedan acceder a ese objeto.
El resultado final sería algo como esto:
utilities_module.py:
def utility_1(args):
code which references a variable named "cur"
def utility_n(args):
etcetera
Y mi módulo principal:
program.py:
import MySQLdb, Tkinter
db=MySQLdb.connect(#blahblah) ; cur=db.cursor() #cur is defined!
from utilities_module import *
Y luego, tan pronto como intento llamar a cualquiera de las funciones de utilidades, se activa el error "nombre global no definido" mencionado anteriormente.
Una sugerencia particular fue tener una declaración "from program import cur" en el archivo de utilidades, como esta:
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 *
Pero eso es una importación cíclica o algo así y, en resumen, también falla. Entonces mi pregunta es:
¿Cómo diablos puedo hacer que el objeto "cur", definido en el módulo principal, sea visible para las funciones auxiliares que se importan en él?
Gracias por su tiempo y mis más sinceras disculpas si la solución se ha publicado en otro lugar. No puedo encontrar la respuesta por mí mismo y no tengo más trucos en mi libro.
db
(y cur
, si insiste) en un módulo independiente que tanto program
y utilities_module
importarlo de. De esa manera, no obtendrá dependencias circulares (programa de importación de módulos que el programa importa) y la confusión que conlleva.
fetch_all
e iterar a través de dos listas en su lugar , o simplemente para que pueda tener dos hilos / greenlets / callback-chains / lo que sea usando la base de datos sin conflictos).