2013-01-03 11 views
5

Al momento ho il codice come questo:Un'alternativa al globale in Python

cache = 1 
def foo(): 
    global cache 
    # many 
    # lines 
    # of code 
    cache = 2 

Tuttavia, questo può portare a difficili da trovare-bugs in futuro, perché il lettore non può notare che global cache appare da qualche parte sopra cache = 2. In alternativa, un contributore potrebbe erroneamente aggiungere def bar(): cache = 2 e dimenticare di aggiungere global cache.

Come posso evitare questo trabocchetto?

+1

Che cosa è esattamente il trabocchetto? Cosa stai cercando di realizzare e cosa non funziona? – BrenBarn

+0

Cosa succede se qualcuno scrive il secondo metodo? Sarà ancora una variabile locale. Non c'è nessun problema con il tuo codice. – ATOzTOA

+2

Se non c'è una dichiarazione 'global', la variabile è locale - se 'il lettore' ha uno sfondo in python, allora sapranno che è locale. Se vuoi davvero, basta aggiungere un commento dicendo che è locale o qualcosa del genere. – Volatility

risposta

12
class Cache: 
    myvar = 1 

def foo(): 
    Cache.myvar = 2 

In questo modo, Cache.myvar è praticamente un "globale". È possibile leggere/scrivere da qualsiasi luogo.

Preferisco questa opzione al dizionario alternativo, perché consente il completamento automatico dei nomi delle variabili.

+1

Ottima risposta, elegante ed esattamente quello che stavo cercando! Grazie –

8
cache = 1 
def foo(): 
    return 2 
cache = foo() 

o

d = {'cache': 1} 
def foo(x): 
    x['cache'] = 2 
foo(d) 
3

"il lettore può involontariamente pensare che la variabile globale è stata aggiornata" non è molto più di una trappola. Devi aspettarti che le persone che leggono il tuo codice sappiano come funziona Python. Se vuoi renderlo più chiaro, usa un commento. Ecco a cosa servono.

2

L'utilizzo della variabile globale non è una buona pratica di programmazione. Passa la variabile come argomento: make function restituisce qualcosa e lo usa in un'altra funzione. La funzione può essere assegnata alla variabile è così che funziona Python.