Alcune funzioni richiedono valori "costanti" (cioè non progettati per essere ridefiniti in un secondo momento) che non devono essere parametrizzati. Mentre gli argomenti predefiniti sono stored only once per each function, alcuni non sono molto significativi per essere inseriti come parametri (ad esempio, per far parte dello signature). Per esempio (non molto utile):In python, come memorizzare 'costanti' per le funzioni solo una volta?
def foo(bar):
my_map = {"rab": barType, "oof": fooType}
return my_map.get(bar,defaultType)()
Ha sprecato tempo CPU e spazio RAM per ridefinire una costante di questo tipo per ogni chiamata. Alcuni altri modi sono di memorizzare costanti come le globali a livello di modulo o rendere la funzione una classe richiamabile, ma potrebbero esserci altri modi, forse?
Nel fare livello di modulo maniera globale, ho prefisso mia (inteso come) variabile costante con un "_" per mostrare che è lì non per interesse di nessuno. Ancora sento il namespace del modulo leggermente "inquinato", per non parlare della shame of using qualcosa as discouraged as globals affatto:
_my_map = {"rab": barType, "oof": fooType}
def foo(bar):
return _my_map.get(bar,defaultType)()
O il trasformarla in una classe modo. Faccio il __call__
un classmethod, per evitare la necessità di istanze che creano:
class foo:
my_map = {"rab": barType, "oof": fooType}
@classmethod
def __call__(cls,bar):
return cls.my_map.get(bar,defaultType)()
Sono queste soluzioni Pythonic abbastanza?
Ci sono altri modi per farlo?
È anche una pratica regolare utilizzare tali "costanti"?
Nota questi oggetti nei miei esempi non sono necessariamente reali costanti, ma utilizzato (e potrebbe essere pensato) come tali dai loro scopo.
Come è menzionato in una di queste risposte (e sono d'accordo con esso), probabilmente vorrai inserire un commento per renderlo più specifico che è una variabile globale, inoltre, ti aspetteresti che le persone leggano il tuo codice per avere una buona conoscenza di Python. Anche se ammetto di essere curioso di una soluzione più elegante! – PascalVKooten
Le costanti globali vanno bene. È lo * stato globale * che causa problemi. – user2357112