Page cover

💾Scope y Namespaces

1. ¿Qué son el Scope y los Namespaces en Python 3?

Antes de hablar sobre clases, es importante que comprendamos los conceptos de Scope y Namespace en Python.

Un Namespace es un mapeo de nombres a objetos. Los Namespaces se crean en diferentes momentos y tienen diferentes tiempos de vida.

Durante la ejecución de un programa en Python 3 se crean diferentes Namespaces que pueden ser accesibles desde diferentes scopes:

  • El Namespace por defecto que se crea cuando el intérprete de Python se inicia es el que contiene los nombres por defecto de Python. Este Namespace nunca se borra.

dir(__builtins__)
['ArithmeticError',
 'AssertionError',
 'AttributeError',
 'BaseException',
 'BlockingIOError',
 'BrokenPipeError',
 'BufferError',
 'BytesWarning',
 'ChildProcessError',
 'ConnectionAbortedError',
 'ConnectionError',
 'ConnectionRefusedError',
 'ConnectionResetError',
 'DeprecationWarning',
 'EOFError',
 'Ellipsis',
 
 ...
  • El Namespace global para un módulo se crea cuando se lee la definición del módulo y, normalmente, dura hasta que el intérprete se cierra.

  • El Namespace local para una función o cualquier otra estructura de Python se crea cuando se llama a la función, y se borra cuando la función termina. Las invocaciones recursivas tienen cada una su propio Namespace.

2. scope en Python 3

El scope es una región de un programa en Python donde un Namespace es directamente accesible.

En Python existen diferentes scopes desde los que se puede acceder a los Namespaces con algunas particularidades que debemos tener en cuenta:

  • El scope local (o de función) es el bloque de código o cuerpo de cualquier función o expresión en Python. Contiene los nombres que se definen dentro de la función. Estos nombres sólo serán visibles desde el código de la función. Se crea en la llamada a la función, no en la definición de la misma, por lo que habrá tantos scopes locales diferentes como llamadas a la función.

La variable var_local_func definida en el Namespace local de la función no es accedida desde un scope global.

  • El scope no local es un ámbito especial que sólo existe para las funciones anidadas. En estos casos el scope local es el cuerpo de la función anidada y el scope no local es el ámbito de la función externa. Los nombres del scope no local son visibles desde el código de las funciones internas y externas.

La variable var_no_local_func es visible desde el código de func2 pero la variable var_local_func2 no es visible desde el código de func

  • El scope global (o de módulo) es el ámbito superior de un programa, script o módulo de Python. Este ámbito de Python contiene todos los nombres que se definen en el nivel superior de un programa o módulo. Los nombres en este ámbito de Python son visibles desde cualquier parte de tu código.

La variable var_global es accesible desde el código de func y cualquier otra función interna. Las variables definidas en func no son accesibles desde este scope.

  • El scope por defecto es un ámbito especial de Python que se crea o carga cada vez que ejecutas un script o abres una sesión interactiva. Este ámbito contiene nombres como palabras clave, funciones, excepciones y otros atributos que están incorporados en Python. Los nombres en este ámbito de Python también están disponibles desde cualquier parte de tu código. Es cargado automáticamente por Python cuando ejecutas un programa o script.

Una de las cosas importantes es que los nombres que se encuentran en un scope determinado puede ser accedidos desde un scope externo pero no pueden ser actualizados o modificados

3. Sentencias global y nonlocal

Teniendo en cuenta el comportamiento por defecto que hemos visto en los apartados anteriores, Python nos proporciona las dos sentencias global y nonlocal para modificarlo si lo necesitásemos.

Última actualización