Come chiamare in setattr () sul modulo attuale?
-
05-10-2019 - |
Domanda
Quello che faccio a passare come primo parametro "object
" per la funzione setattr(object, name, value)
, alle variabili impostati sul modulo attuale?
Ad esempio:
setattr(object, "SOME_CONSTANT", 42);
dando lo stesso effetto:
SOME_CONSTANT = 42
all'interno del modulo contenente queste righe (con il object
corretta).
Sono generare diversi valori a livello di modulo in modo dinamico, e come io non so definire __getattr__
a livello di modulo, questo è il mio fallback.
Soluzione
import sys
thismodule = sys.modules[__name__]
setattr(thismodule, name, value)
o, senza l'utilizzo di setattr
(che rompe la lettera della domanda, ma soddisfa gli stessi scopi pratici; -):
globals()[name] = value
Nota ??strong>: in un contesto di modulo, quest'ultimo è equivalente a:
vars()[name] = value
che è un po 'più conciso, ma non funziona all'interno di una funzione (vars()
dà le variabili del campo di applicazione è chiamato a: variabili del modulo quando chiamato nell'ambito globale, e quindi è ok per usarlo R / W , ma le variabili della funzione quando viene chiamato in una funzione, e quindi deve essere trattata come R / O -. la documentazione on-line Python possono essere un po 'di confusione su questo specifico distinzione)
Altri suggerimenti
Se è necessario impostare le variabili di modulo con ambito all'interno del modulo, cosa c'è di sbagliato con global
?
# my_module.py
def define_module_scoped_variables():
global a, b, c
a, b, c = 'a', ['b'], 3
così:
>>> import my_module
>>> my_module.define_module_scoped_variables()
>>> a
NameError: name 'a' is not defined
>>> my_module.a
'a'
>>> my_module.b
['b']
In Python 3.7, si sarà in grado di utilizzare __getattr__
a livello di modulo ( relativa risposta ).
PEP 562 :
def __getattr__(name):
if name == "SOME_CONSTANT":
return 42
raise AttributeError(f"module {__name__} has no attribute {name}")
- Non lo faresti. Fareste
globals()["SOME_CONSTANT"] = 42
- Non lo faresti. Si potrebbe memorizzare dinamicamente generati da qualche contenuto diverso da un modulo.