una domanda stupida, ma questo mi è bugging (indipendentemente downvotes per la mia imbecillità!): Penso che ho raccolto una paura senza senso dei dati che generano al di fuori di un metodo che utilizza il metodo (senza cambiare), ma non sono sicuro se questo è il caso.modo Pythonic di generare dati al di fuori di un metodo
Diciamo che ho un metodo di myfx
, che avrà bisogno di un po 'di dizionario datadex
che richiede una lunga operazione da fare, ma sarà comune a tutte le chiamate durante quella sessione. Il modo più semplice, ma non fattibile, è:
def myfx(x,foo):
datadex={f:42 for f in foo} #initialise
mungeddata=datadex[x]+1 #munge
return mungeddata
ma che farà perdere troppo tempo. Quindi la cosa migliore sarebbe quella di farlo nel campo di applicazione principale una volta come si fa con le variabili di classe:
datadex={f:42 for f in foo} #initialise
def myfx(x):
mungeddata=datadex[x]+1 #munge
return mungeddata
Tuttavia, non so perché, ma mi fanno di tutto per evitare questo. È inelegante, ma non penso che sia così. Generalmente ricorrere alle chiusure:
def initialise(foo):
datadex={f:42 for f in foo} #initialise
def myfx(x):
mungeddata=datadex[x]+1 #munge
return mungeddata
return myfx
O peggio fare una lezione. Codigo quasi esclusivamente in Python e JS. La mia ipotesi migliore è che è un ritorno al passato dai miei Perl giorni di codifica -Subconsciously mi ritrovo a scrivere somethinge variabili prima alla Pascal, quindi penso che alcune abitudini indugiare come ombre-, ma questo non spiegherebbe il modo di classe o la chiusura di OO-Perl è completamente differente.
'Non so perché, ma faccio di tutto per evitarlo. E 'poco elegante, ma non credo che sia il case' - Sembra che tu stia istintivamente pensare programmazione funzionale, dove (tra le altre cose) variabili non possono essere cambiati una volta definito – Izkata
(a) Qual è esattamente la tua domanda? (b) Non hai considerato di passare semplicemente 'datadex' come argomento alle funzioni (non vedo metodi qui) che lo usano? – jwodder
Sì, che 'il metodo initialise' è fondamentalmente facendo applicazione funzione parziale. C'è un aiutante per il solo che in [functools] (https://docs.python.org/3/library/functools.html) chiamato [parziale] (https://docs.python.org/3/library/functools. html # functools.partial) – dtanders