2010-06-21 14 views
7

sé que puedo escribir:¿Sobrescribe la var global en una línea en Python?

foo = 'bar' 
def update_foo(): 
    global foo 
    foo = 'baz' 

Pero hacer que realmente necesito dos líneas de código allí? Python, por desgracia, no permitirá que diga

global foo = 'baz' 

que también podría hacer puré las dos líneas junto con los repetitivos lamentablemente

global foo; foo = 'baz' 

Cualquier otro atajos? Estoy en Python 2.6.5, pero también me gustaría escuchar respuestas para Python 3.

+2

¿Cuál es la intención de tal ejercicio? Cuando usas 'global', declaras que pretendes inmiscuirte en una variable que no te pertenece (presumiblemente s/o else), pero ¿por qué anularla de inmediato, incluso antes de comprobar qué contiene? No parece tener sentido práctico ... –

+0

Estoy de acuerdo, siempre he querido hacer esto. También quiero un desempaquetado de tuplas más inteligente, pero no puedes ganarlos a todos :) –

Respuesta

12

Se podía usar mi alternativa preferida a global (un sabor muy peculiar ...):

import sys 
thismodule = sys.modules[__name__] 
thismodule.foo = 'bar' 

def update_foo(): 
    thismodule.foo = 'baz' 

Una vez que haya tomado la referencia thismodule, no es necesario utilizar global en este módulo, porque siempre se está trabajando con cualificado nombres en lugar de nombres desnudos (una idea mucho mejor en mi humilde opinión ... pero tal vez solo en MHO, no he podido convencer a Guido de suministrar thismodule [[o algún otro identificador con esta funcionalidad]] cuando Python 3 estaba gestando).

Tenga en cuenta que la primera asignación de foo, a nivel mundial, se puede hacer con esta sintaxis explícita, o asignando a barename foo como lo hace en su código (supongo que no es sorprendente que mi preferencia va a la forma explícita, sin embargo, en este caso, apenas).

+0

¿Le da al módulo una palabra clave 'this'? Por alguna razón que solo me da los heebiejeebies. Si yo fuera Guido, haría que las declaraciones globales incluyan un signo de advertencia gigante rojo intermitente. –

+0

Usted acaba de abrir mi mente a un nuevo reino de versatilidad con esta pepita de oro. ¡Aclamaciones! – Ephexx

6

Son dos afirmaciones, no hay otras formas.

+0

+1: Es solo así. –

+0

... solo si has jurado usar nombres desnudos ... ;-). –

3

Se puede escribir como este usando el diccionario globals():

def update_foo(): 
    globals()['foo'] = 'baz' 

pero sólo se quedaría con las 2 líneas o la separación con un enfoque ;.

+0

Es cierto, aunque generalmente no se recomienda jugar con 'globals()' (y aún más 'locales()'). –

+1

De http://www.python.org/dev/peps/pep-0020/, "Explícito es mejor que implícito". –

1

Si te hace sentir mejor ponerlo todo en una línea ...

global foo; foo = 'baz' 
2
def update_foo(): 
    globals().update(foo='baz') 
Cuestiones relacionadas