Nombres, Espacios de nombres, Módulos, Librerías y Paquetes¶
- Un nombre es el identificativo que le damos a un objeto (variable, función, …).
- Un espacio de nombres es una colección de nombres que referencian a objetos.
- Ej: operaciones built-in = {print(), len(), …}
- Un módulo es un archivo .py que contiene nombres.
- Una librería es un conjunto de módulos.
- Un paquete en un conjunto de librerías
Alcance de nombres (namespaces)¶
Es el lugar o espacio dentro de un programa en el cual un nombre (variable, clase, etc.) es válido.
En python hay 3 alcances:
- Alcance local - nombres definidos dentro de una función o método
- Alcande de módulo - nombres definidos dentro de un archivo
- Alcance interno - nombres definidos dentro de Python (están siempre disponibles)
# variables con alcance de módulo
W = 5
Y = 3
#los parámetros son como variables de la función
#por eso X tiene alcance local
def spam(X):
#decirle a la función que busque en el nivel de módulo y que no cree su propia variable W
global W
Z = X*2 # crea nueva variable local Z
W = X+5 # usa la variable W del módulo (global)
if Z > W:
# print pertenece al alcance interno de Python
print( f"2 x {X} es mayor que {X} + 5")
return Z
else:
print( f"2 x {X} es menor o igual que {X} + 5")
return Y # no exite variable Y local, por lo que usa la variable Y del módulo
print(f'{W=}, {Y=}')
spam(1)
print(f'{W=}, {Y=}')
spam(20)
print(f'{W=}, {Y=}')
W=5, Y=3 2 x 1 es menor o igual que 1 + 5 W=6, Y=3 2 x 20 es mayor que 20 + 5 W=25, Y=3
Ejemplo con bucles¶
x = 0
for x in range(10):
pass
print(x)
9
Uso de módulos¶
Vamos a introducir algunos de los módulos estándar o que vienen por defecto en Python.
En secciones siguientes veremos algunos módulos típicamente usados para computación con grandes cantidades de datos, ciencia, ...
Aprovechando que en la próxima sección veremos como trabajar con archivos, abrir un archivo, escribir y demás, vamos a introducir brevemente cómo se importa el módulo os para poder usarlo en nuestro código.
Para importar un módulo, ya sea estándar o propio (recordemos cualquier archivo .py ya es un módulo) podemos escribir cualquiera de las siguientes opciones.
import module_name | import module_name as alias¶
Para importar un módulo usamos la palabra import.
Cuando importamos un módulo o un nombre contenido en ese módulo, podemos asignar cada elemento importado un alias.
De esta forma evitamos problemas si queremos importar un mismo nombre contenido en varios módulos, podemos evitar conflictos, etc...
import os
import os as alias
from module_name import name | from module_name import name as alias¶
Para importar nombres de un módulo, usamos la palabra from. Esto importa aquellos nombres que hemos especificado pero no el módulo en sí.
from os import path
from os import path as ruta
from os import path, __name__ as module_name
from os.path import basename
__name__, module_name
('__main__', 'os')
from module_name import *¶
Esta sentencia import todos los nombres de una módulo. Pero, no es buena práctica porque un módulo puede ser muy largo (pesado) y es importante saber qué tenemos a nuestra disposición y qué estamos usando.
Si no estamos usando un módulo, es mejor no importarlo.
# Aplicar dir() nos devuelve todos los nombres que hay en un archivo
dir()
['In', 'Out', 'W', 'Y', '_', '_4', '__', '___', '__builtin__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', '__vsc_ipynb_file__', '_dh', '_i', '_i1', '_i2', '_i3', '_i4', '_i5', '_ih', '_ii', '_iii', '_oh', 'alias', 'basename', 'exit', 'get_ipython', 'module_name', 'open', 'os', 'path', 'quit', 'ruta', 'spam', 'x']
from os import *
dir()
['DirEntry', 'F_OK', 'In', 'O_APPEND', 'O_BINARY', 'O_CREAT', 'O_EXCL', 'O_NOINHERIT', 'O_RANDOM', 'O_RDONLY', 'O_RDWR', 'O_SEQUENTIAL', 'O_SHORT_LIVED', 'O_TEMPORARY', 'O_TEXT', 'O_TRUNC', 'O_WRONLY', 'Out', 'P_DETACH', 'P_NOWAIT', 'P_NOWAITO', 'P_OVERLAY', 'P_WAIT', 'R_OK', 'SEEK_CUR', 'SEEK_END', 'SEEK_SET', 'TMP_MAX', 'W', 'W_OK', 'X_OK', 'Y', '_', '_4', '_5', '__', '___', '__builtin__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', '__vsc_ipynb_file__', '_dh', '_exit', '_i', '_i1', '_i2', '_i3', '_i4', '_i5', '_i6', '_ih', '_ii', '_iii', '_oh', 'abort', 'access', 'alias', 'altsep', 'basename', 'chdir', 'chmod', 'close', 'closerange', 'cpu_count', 'curdir', 'defpath', 'device_encoding', 'devnull', 'dup', 'dup2', 'environ', 'error', 'execl', 'execle', 'execlp', 'execlpe', 'execv', 'execve', 'execvp', 'execvpe', 'exit', 'extsep', 'fdopen', 'fsdecode', 'fsencode', 'fspath', 'fstat', 'fsync', 'ftruncate', 'get_exec_path', 'get_handle_inheritable', 'get_inheritable', 'get_ipython', 'get_terminal_size', 'getcwd', 'getcwdb', 'getenv', 'getlogin', 'getpid', 'getppid', 'isatty', 'kill', 'linesep', 'link', 'listdir', 'lseek', 'lstat', 'makedirs', 'mkdir', 'module_name', 'name', 'open', 'os', 'pardir', 'path', 'pathsep', 'pipe', 'popen', 'putenv', 'quit', 'read', 'readlink', 'remove', 'removedirs', 'rename', 'renames', 'replace', 'rmdir', 'ruta', 'scandir', 'sep', 'set_handle_inheritable', 'set_inheritable', 'spam', 'spawnl', 'spawnle', 'spawnv', 'spawnve', 'startfile', 'stat', 'stat_result', 'statvfs_result', 'strerror', 'supports_bytes_environ', 'symlink', 'system', 'terminal_size', 'times', 'times_result', 'truncate', 'umask', 'uname_result', 'unlink', 'unsetenv', 'urandom', 'utime', 'waitpid', 'waitstatus_to_exitcode', 'walk', 'write', 'x']