Compartir variables entre módulos de un programa...

Agrupa todas las consultas sobre los lenguajes de programacion como C, C++, Python, Java ...

Compartir variables entre módulos de un programa...

Notapor Metator de Arkalot » Dom Ene 11, 2009 12:35 am

Quisiera saber si se puede compartir una variable entre
módulos de pygame sin tener que importarla en todos...

Me explico:
Estoy desarmando unos ejemplos en pygame en partes
(módulos: clases, funciones, run, etc) y al parecer, ahora
necesito importar todos en cada uno de los paquetes que hice...

Estaba pensando en hacer un archivo que importara todo
lo que los módulos necesitan (import pygame, os, random, etc)
y que cada módulo unicamente importe ese archivo, pero no se
si Python cargará pygame cada vez que un módulo lo importe :?
temo que cada modulo tenga su propio pygame O_o. Además,
hasta ahora, cuando tengo una función en un módulo que hace blit
sobre el display, necesito enviarle la superficie de esta forma:

Código: Seleccionar todo
>>> screen = pygame.display.set_mode()
# En el programa principal, llamo a una funcion incluida en un paquete:
>>> funciones.pintar_mapa(screen, mapa)
# El módulo funciones.py necesita que se le envie una referencia al screen.


Quiza algo tenga que ver con variables locales y globales, pero
no tengo ni idea :?:
Avatar de Usuario
Metator de Arkalot
 
Mensajes: 34
Registrado: Mié Abr 23, 2008 2:17 am
Ubicación: México ñ_ñ !!

Notapor hugoruscitti » Dom Ene 11, 2009 9:12 pm

m... tal vez estes buscando usar una sentencia
como "from modulo import screen" o algo así.

Si solo se trata de la referencia a screen ten en
cuenta que hay un método del módulo "pygame.display"
que te retorna la referencia a la pantalla principal.

o tal vez no entendí tu consulta... en general si necesitas
compartir referencias, usas parámetros en las funciones y
si tienes que definir relaciones mas complejas defines
objetos con referencias dentro de ellos.
Avatar de Usuario
hugoruscitti
Site Admin
 
Mensajes: 1242
Registrado: Dom Jul 30, 2006 3:57 am
Ubicación: Buenos Aires, Argentina

Notapor Metator de Arkalot » Lun Ene 12, 2009 7:28 pm

Ok, no supe explicarme nada bien...

Me gustaria que alguien me explicara que es lo que hace Python
cuando encuentra una sentencia import o from-import, ya que no
se que es exactamente lo que hace. :?: Estudiando un poco de C,
lei que cuando el compilador encuentra una sentencia #incluce <algo.h>
primero sustituye esas sentencias por el contenido de "algo.h"
con lo cual seria como si escribieramos el contenido de "algo.h"
al principio de nuestro programa, ¿cierto?. Y ya después compila todo...

Entonces, si tengo un programa Python y al principio importo pygame
>>> import pygame
>>> from algo import *

Y tengo un archivo con la clase de un personaje, el cual también usa
las funciones de pygame, entonces vuelvo a importar todo en ese fichero,
tengo un resultado como este:

Código: Seleccionar todo
# programa principal
>>> import pygame
>>> from clases.soldado import soldado


¿que es lo que hizo la última sentencia?, ¿ejecutó el código aparte,
cargando pygame de nuevo?, ¿incluyó su contenido en el programa
actual, como #include?
Si lo ejecutó, que pasa si importo pygame en el programa principal
y después lo importo de nuevo en el módulo recien importado,
¿simplemente machaco las importaciones anteriores?

Estas dudas me surgieron cuando trabajaba con un programa aparte,
el cual usaba funciones de pygame pero no lo habia importado ahi, sino
en el programa principal, el cual importaba ese módulo:
>>> import pygame
>>> import clases.soldado # este módulo no importa pygame auque utiliza sus funciones

La primera vez que ejecute el fichero todo salio bien, pero la segunda,
sin haber cambiado nada, me dio el error de <global name pygame no especificado>

O_o
Avatar de Usuario
Metator de Arkalot
 
Mensajes: 34
Registrado: Mié Abr 23, 2008 2:17 am
Ubicación: México ñ_ñ !!

Notapor hugoruscitti » Lun Ene 12, 2009 8:30 pm

Metator de Arkalot escribió:Entonces, si tengo un programa Python y al principio importo pygame
>>> import pygame
>>> from algo import *

Y tengo un archivo con la clase de un personaje, el cual también usa
las funciones de pygame, entonces vuelvo a importar todo en ese fichero,
tengo un resultado como este:

Código: Seleccionar todo
# programa principal
>>> import pygame
>>> from clases.soldado import soldado


¿que es lo que hizo la última sentencia?, ¿ejecutó el código aparte,
cargando pygame de nuevo?, ¿incluyó su contenido en el programa
actual, como #include?


Según veo en el siguiente documento:

http://effbot.org/zone/import-confusion.htm

python sigue un algoritmo para evitar trabajo innecesario, cuando
el interprete encuentra una sentencia como import, busca en el
diccionario "sys.modules" si tiene una referencia a él. Si no
tiene la referencia, significa que tiene que cargar el módulo y
colocar una referencia en el diccionario "sys.modules". La siguiente
vez que se quiera incluir el mismo módulo con import, python sabrá
que ya se ha cargado y solamente buscará su referencia en el
diccionario.


Este es un ejemplo de la linea de comandos de python, muestra como
se llena el diccionario de referencias 'sys.modules':

Código: Seleccionar todo
>>> import sys
>>> sys.modules['pygame']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'pygame'
>>> import pygame
>>> sys.modules['pygame']
<module 'pygame' from '/usr/lib/python2.5/site-packages/pygame/__init__.pyc'>


Aparentemente, la respuesta a tu pregunta está en el documento
web que cité mas arriba, hay una deferencia entre la ejecución
inicial que python hace al módulo cuando lo importa, que la ejecución
de las partes de ese módulo.

Saludos.
Avatar de Usuario
hugoruscitti
Site Admin
 
Mensajes: 1242
Registrado: Dom Jul 30, 2006 3:57 am
Ubicación: Buenos Aires, Argentina


Volver a Sobre lenguajes de programación

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron