Bienvenidos sean a este post, hoy veremos como python interpreta lo que ingresemos para ejecutarlo correctamente y como los maneja.
Uno de los primeros temas que veremos hoy son los nombres (names) y los espacio de nombres (namespaces), como se pueden ver son dos temas distintos pero que estan relacionados entres si, primero hablaremos sobre los names o nombres que no dejan de ser un titulo o etiqueta para identificar un valor, efectivamente podemos considerarlo como variables, para entender el concepto vamos a realizar el siguiente ejemplo.
Como siempre abrimos nuestro interprete, les recuerdo que no es necesario crear un entorno virtual pero si desean practicar pueden hacerlo, una vez dentro del interprete ejecutaremos esta linea:
>>> n = 3;
En este caso tenemos un «nombre» llamado n y almacenara el valor 3, agreguemos el siguiente valor:
>>> direccion = "Libertad 41, CP 1012, CABA"
Aqui creamos otro llamado direccion y le guardaremos un nuevo valor que es una direccion de un domicilio, finalmente agregaremos el siguiente valor:
>>> empleado = {
... 'edad': 44,
... 'puesto': 'CEO',
... 'cuil': 25123789456
... }
>>>
En un post mencione al prompt que espera un comando (>>>) pero tambien tendremos el prompt … y este sera cuando al comando que pasamos le falte informacion, en este caso utilizamos una variable llamada empleado y como usamos una llave porque vamos a guardar mas de un dato al presionar Enter pasara a ese prompt y podremos cargar todos los datos necesarios, en este caso sera algo que mas adelante explicaremos bien pero es llamado dictionary, el cual es una variable que puede almacenar varios datos en una relacion clave/valor, los mismos se separan por comas y el primer campo informa la clave y el segundo es el valor relacionado, observen que despues que cerramos la llave volvimos al prompt de siempre, con estos tres datos podemos pasar a mostrarlos, probemos de mostrar el primer nombre y para ello solo deben escribirlo en el interprete:
>>> n
3
>>>
Como ven nos trajo el dato almacenado, probemos con el segundo nombre:
>>> direccion
'Libertad 41, CP 1012, CABA'
>>>
Tambien nos trajo la informacion almacenada, veamos el tercer nombre:
>>> empleado
{'edad': 44, 'puesto': 'CEO', 'cuil': 25123789456}
>>>
Como pueden ver nos trajo toda la informacion almacenada dentro de la misma pero como extraer cada valor es un tema que veremos mas adelante, probemos de ejecutar el siguiente nombre:
>>> direc
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'direc' is not defined
>>>
En este caso nos devolvio un error porque en ningun momento lo definimos, si son conocedores de otros lenguajes saben que debemos definir el tipo de dato que almacenara la variable pero este lenguaje trabaja de una forma similar a los scripts de tipo web, p.e. Javascript, y este lo asigna dinamicamente en base a la informacion que recibe, vamos a pasar al siguiente tema.
El concepto de espacio de nombres o namespaces es una forma de poder brindar la ubicacion de nuestros objetos entre los distintos modulos y paquetes, por ejemplo vamos a tomar el «programa» del post anterior:
ejemplo
├── nucleo.py
├── juego.py
└── objetos
├── __init__.py
├── arbol.py
├── edificio.py
└── pepe.py
Vamos a suponer que tenemos una funcion dentro de pepe.py llamada tomardatos y esta nos va a ser util en otro programa, para poder usarla en nuestro otro programa vamos a usar el siguiente comando:
>>> from ejemplo.objetos.pepe import tomardatos
Si conocen otros lenguajes de OOP (Programacion Orientada a Objetos por sus siglas en ingles) notaran que los namespaces son la ruta que utilizamos para pasar por las distintas clases donde esta la funcion necesitada, observen que nuestro camino siempre va a ir primero el nombre del programa, es decir la raiz del mismo, luego ira el o los nombres de todos los paquetes hasta llegar al modulo que contiene la funcion a utilizar, en todos los casos para unir los distintos nombres usamos el operador de punto (.) para finalmente informar el modulo, luego por medio de import incorporamos nuestra funcion, si observan es muy similar a cuando vimos en el post anterior para utilizar funciones de un paquete pero con la diferencia que esta sera la forma de especificar paquetes creados por nosotros, basicamente un namespace o espacio de nombres es la ubicacion exacta del paquete donde debemos importar la funcion necesitada.
Alcances
Cuando hablamos de alcances o scopes nos referimos a como sera el alcance de nuestra variable o nombre, es decir global o local, al igual que en cualquier lenguaje cuando hablamos de global significa que sera alcanzada por todo el programa, en cambio las locales son solamente para el bloque o funcion donde se crearon, vamos a ver el siguiente ejemplo para entenderlo mejor, vamos a crear un archivo llamado scopes.py y le agregaremos el siguiente codigo:
scopes.py
def local():
m = 15
print(m,'variable local')
def local2():
print(m * 2, 'variable global x 2')
m = 5
print(m,'variable global')
local()
local2()
En este caso primero definimos una funcion que llamaremos local, en ella definimos un valor para m y luego lo mostramos en pantalla con la identificacion de que es una variable local, despues creamos una nueva funcion llamada local2 en la cual tomara el valor de m y lo multiplicara por 2, en este caso dentro de la funcion no definimos ningun valor de m, luego volvemos a definir el valor de m con otro valor y lo mostramos en pantalla con la indicacion de que es global, por ultimo llamamos a la funcion local y luego a local2, ejecutemos el archivo mediante python y veamos su salida:
tinchicus@dbn001vrt:~/python$ python3 scopes.py
5 variable global
15 variable local
10 variable global x 2
tinchicus@dbn001vrt:~/python$
Si observan primero nos mostro el valor de m a nivel global, luego llamamos a local y nos muestra no solo el mensaje sino tambien el nuevo valor de m, por ultimo vemos el mensaje de local2 pero esta vez vemos que la multiplicacion la hizo con el valor de m a nivel global y no con el valor de la funcion anterior, esto sucede porque cuando una variable o nombre es creada dentro de un bloque o funcion la misma es borrada de memoria cuando este finaliza, en cambio la global existira mientras el programa se este ejecutando, cual es la ventaja de tener una local? Tiene dos ventajas, una que en general es mas rapida para accederla y procesarla y la otra que no ocupa memoria por mucho tiempo, mas adelante veremos como se utilizan entre ambas pero por ahora quedense con el concepto de hasta donde llegan las variables o nombre locales y hasta cuando existen las globales, les dejo un video para ver como se trabaja con el interprete.
Por ultimo vamos a mencionar un concepto que desarrollaremos mas adelante, en este caso objetos y clases, la clase al igual que en cualquier lenguaje se utilizan para crear elementos que no existen, por lo general una clase es descripta como un molde y los objetos son elementos que se crean con ese molde, en general se utilizan para poder crear los elementos que sean necesarios para nuestros programas pero no se preocupen cuando llegue el momento hablaremos a fondo sobre esto.
En resumen, hoy hemos visto que son los nombres, como los utilizaremos, que son los namespaces o espacio de nombres, como nos ayudan a importar funciones de paquetes que crearemos en un futuro no muy lejano, tambien hemos hablado sobre los alcances de un nombre, es decir el concepto de locales y globales, tambien hemos hecho una pequeña mencion sobre clases y objetos, espero les haya sido de utilidad sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.


Donación
Es para mantenimento del sitio, gracias!
$1.00
