2011-12-30 11 views
5

Me preguntaba si alguien tenía alguna idea sobre el uso de Python global frente a la referencia del módulo en sí. Mientras que en el pasado solía global cuando sea necesario, he encontrado que es algo más clara para hacer el segundo método (y recientemente han tendido a favorecer esta sintaxis):Uso de Python de global versus especificación del módulo

import sys 
mod = sys.modules[__name__] 

counter = 0 

def incrementGlobal(): 
    global counter 
    counter += 1 

def incrementMod(): 
    mod.counter += 1 

Obviamente ambos funcionan bien, pero si alguien tiene opiniones fuertes (lo que es más pitónico, rendimiento, etc.), me encantaría escucharlas.

Por cierto que terminan usando cualquiera de éstos en situaciones en que el módulo de forma natural encapsula todos los métodos y atributos de lo que sería una sola clase, y en lugar de incrementmodule.IncrementClass.counter referencia que sólo puede utilizar incrementmodule.counter.

+2

¿Cómo está el segundo más claro? – delnan

+0

Supongo que no es mucho más claro, pero lo prefiero ya que es obvio que una variable de nivel de módulo está siendo modificada, en lugar de una local (evita que tenga que volver atrás para ver si la variable está en la declaración global en la parte superior) – gnr

+3

Si el 'global' y la tarea están tan lejos, tienes problemas de claridad peor que eso;) – delnan

Respuesta

5

Vaya con global cada vez. La palabra clave global es un patrón obvio y fácilmente reconocible para modificar algo a nivel de módulo. Darle un módulo a una referencia desde el sys.modules parece una forma innecesariamente intrincada de eludirlo, y es probable que confunda al próximo programador que lo mira.

3
  • Rendimiento: usando el estilo global será muy ligeramente más rápido, ya que sólo se necesita una búsqueda de nombre en lugar de dos (lo haría sólo la materia en un bucle estrecho de muchos miles).

  • estilo: el estilo mod.xxx refleja la forma en que accedería a variables globales de otro módulo que había importado:

`

import foo 
foo.eggs = 'scrambled' 

El método global es más común, pero su mod.xxx El método también es fácil de entender y muy legible.

+2

No downvote, pero usar 'global' es mucho más común que usar' mod.xxx', entonces yo diría que usar 'global' es más legible, porque esto es lo que casi todos esperan. – EOL

+0

@EOL: de acuerdo en que 'global' es el método predominante, y el más reconocible de inmediato. –

Cuestiones relacionadas