Apa yang harus saya berikan sebagai parameter pertama " object
" ke fungsi setattr(object, name, value)
, untuk menyetel variabel pada modul saat ini?
Sebagai contoh:
setattr(object, "SOME_CONSTANT", 42);
memberikan efek yang sama seperti:
SOME_CONSTANT = 42
dalam modul yang berisi baris-baris ini (dengan benar object
).
Saya menghasilkan beberapa nilai pada level modul secara dinamis, dan karena saya tidak dapat mendefinisikan __getattr__
pada level modul, ini adalah fallback saya.
vars()
di lingkup tingkat modul daripada di dalam fungsi.vars()
setara denganglobals()
at module scope (dan mengembalikan sebuah dikt yang benar dan dapat dimodifikasi) tetapi kelocals()
pada ruang lingkup fungsi (dan mengembalikan pseudodiktus yang tidak pernah dimodifikasi). Saya menggunakanvars()
di lingkup modul karena menyimpan 3 karakter, satu suku kata, vs sinonim-dalam-lingkup-ituglobals()
;-)exec ''
: waktu fungsi dengan beberapa loop substansial setiap cara, dan Anda akan melihat pentingnya pengoptimalan inti ini untuk kinerja Python.Di Python 3.7, Anda akan dapat menggunakan
__getattr__
di level modul ( jawaban terkait ).Per PEP 562 :
def __getattr__(name): if name == "SOME_CONSTANT": return 42 raise AttributeError(f"module {__name__} has no attribute {name}")
sumber
Jika Anda harus menyetel variabel cakupan modul dari dalam modul, apa yang salah
global
?# my_module.py def define_module_scoped_variables(): global a, b, c a, b, c = 'a', ['b'], 3
jadi:
>>> import my_module >>> my_module.define_module_scoped_variables() >>> a NameError: name 'a' is not defined >>> my_module.a 'a' >>> my_module.b ['b']
sumber
global but not really
pernyataan itu membingungkan. Saya kira itu mungkin peninggalan sejarah yang mendahului ruang nama modul.globals()["SOME_CONSTANT"] = 42
sumber
SOME_CONSTANT
dihitung saat run-time tidak benar-benar konstan. Dan jikaglobals()
tidak tersedia untuk Anda, maka Anda harus menjangkau modul lain untuk mengubah atributnya; yang pasti membuat orang bertanya-tanya.