2010-06-21 7 views
7

Je sais que je peux écrire:Remplacer global var dans une ligne en Python?

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

Mais dois-je vraiment besoin de deux lignes de là code? Python, hélas, ne me permet pas de dire

global foo = 'baz' 

Je pourrais aussi écraser les deux lignes en même temps que les

malheureusement répétitives
global foo; foo = 'baz' 

Tous les autres raccourcis? Je suis sur Python 2.6.5, mais je serais curieux d'entendre les réponses pour Python 3 aussi.

+2

Quelle est l'intention de cet exercice? Lorsque vous utilisez 'global', vous déclarez que vous avez l'intention de vous mêler à une variable qui ne vous appartient pas (probablement à d'autres), mais pourquoi la remplacer immédiatement, avant même de vérifier ce qu'elle contient? Ça ne semble pas avoir de sens pratique ... –

+0

Je suis d'accord, j'ai toujours voulu faire ça. Je veux aussi un déballage plus intelligent, mais vous ne pouvez pas les gagner tous :) –

Répondre

12

Vous pouvez utiliser ma solution préférée à global (un goût assez idiosyncratique ...):

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

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

Une fois que vous avez fait la référence thismodule, vous n'avez pas besoin d'utiliser global dans ce module, parce que vous travaillez toujours avec qualifié noms plutôt que nu noms (une bien meilleure idée IMHO ... mais peut-être dans MHO seulement, je n'ai pas été en mesure de convaincre Guido de fournir thismodule [[ou un autre identifiant avec cette fonctionnalité]] retour lorsque Python 3 était en train de gestation).

Notez que la première affectation à foo, au niveau mondial, peut se faire soit avec cette syntaxe explicite, ou en affectant à barename foo comme vous le faites dans votre code (je suppose que ce n'est pas surprenant que ma préférence va à la forme explicite, cependant, dans ce cas, juste à peine).

+0

Donner au module un mot clé 'this'? Pour une raison quelconque, cela me donne juste les heebiejeebies. Si j'étais Guido, je ferais en sorte que les déclarations globales incluent un panneau d'avertissement clignotant rouge géant. –

+0

Vous venez d'ouvrir mon esprit à un tout nouveau royaume de la polyvalence avec cette pépite d'or. À votre santé! – Ephexx

6

Il s'agit de deux instructions, il n'y a pas d'autres formes.

+0

+1: C'est comme ça. –

+0

... seulement si vous avez juré d'utiliser uniquement des noms de bars ... ;-). –

3

Vous pouvez l'écrire comme ceci en utilisant le dictionnaire globals():

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

mais je voudrais juste coller avec les 2 lignes ou la séparation avec une approche ;.

+0

Vrai, bien que l'utilisation de 'globals()' (et plus encore 'locals()') ne soit pas recommandée. –

+1

De http://www.python.org/dev/peps/pep-0020/, "Explicit est meilleur qu'implicite". –

1

Si elle vous fait vous sentir mieux de le mettre sur une seule ligne ...

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