variable enclosing def python variables module scope coding-style

python - enclosing - accediendo al "módulo de alcance" vars



variable def python (4)

Actualmente estoy aprendiendo Python, y tengo que trabajar en un proyecto Python 2.7.

El acceso a las variables del "alcance del módulo" en las funciones del módulo en sí mismo es un poco confuso para mí, y no logré encontrar una manera satisfactoria.

Mis intentos hasta ahora:

Camino 1:

mi_módulo.py

my_global_var = None def my_func(): global my_global_var my_global_var = ''something_else''

Aquí creo que confundir las variables locales y de "módulo de alcance" puede ser bastante fácil.

Camino 2:

mi_módulo.py

import my_module my_global_var = None def my_func(): my_module.my_global_var = ''something_else''

Aquí, el nombre de "my_module" no se puede cambiar tan fácilmente como "forma 1" cuando es necesario. Además, importar un módulo en sí mismo suena bastante raro.

¿Qué recomendarías? ¿O sugerirías algo más? Gracias.


Evita establecer globals en absoluto. Puede crear nuevos espacios de nombres con clases con bastante facilidad, así que use las variables de clase si es necesario.

Para cualquier cosa seria necesitas un diseño adecuado con clases de todos modos.


Importar un módulo dentro de sí mismo puede tener efectos secundarios no deseados (como evaluar afirmaciones más de una vez). Sugeriría usar "Way 1" y una herramienta como pylint para ayudar a verificar su código y hacer cumplir prácticas comunes.

PyLint se puede encontrar en: http://www.logilab.org/project/pylint


La forma 1 es la forma correcta cuando es absolutamente necesario volver a vincular una variable global. Sin embargo, debe preguntarse por qué está modificando un global y si hay algo mejor que pueda hacer (como encapsular el comportamiento en una clase).

Debe evitarse la importación de un módulo en sí mismo ya que es propenso a errores. Si el módulo también es una secuencia de comandos, a veces necesitaría importar __main__ , o si el módulo es parte de un paquete, tal vez debería importar foo.my_module . En resumen, no hagas eso.


Probablemente quieras leer sobre los espacios de nombres de Python . La manera 1 es correcta pero generalmente innecesaria, nunca use 2. Un enfoque más fácil es simplemente usar un dict (o clase o algún otro objeto):

my_globals = {''var'': None} def my_func(): my_globals[''var''] = ''something else''

Las asignaciones siempre van al ámbito más interno y el alcance más interno siempre se busca primero, por lo tanto, la necesidad de la palabra clave global. En este caso, no está asignando un nombre, por lo que es innecesario.