Co mam przekazać jako pierwszy parametr " object
" do funkcji setattr(object, name, value)
, aby ustawić zmienne w bieżącym module?
Na przykład:
setattr(object, "SOME_CONSTANT", 42);
dające taki sam efekt jak:
SOME_CONSTANT = 42
w module zawierającym te linie (z poprawnym object
).
Generuję kilka wartości na poziomie modułu dynamicznie, a ponieważ nie mogę zdefiniować __getattr__
na poziomie modułu, jest to moja rezerwa.
vars()
zakres na poziomie modułu, a nie wewnątrz funkcji.vars()
jest równoważne zglobals()
zakresem modułu (i dlatego zwraca prawdziwe, modyfikowalne polecenie), ale zlocals()
zakresem funkcji (i dlatego zwraca pseudodict, którego nigdy nie można modyfikować). Używamvars()
w zakresie modułu, ponieważ zapisuje 3 znaki, jedną sylabę, w porównaniu z jej synonimem w tym zakresieglobals()
;-)exec ''
: zmień czas na funkcję z kilkoma istotnymi pętlami w każdą stronę, a zobaczysz znaczenie tej podstawowej optymalizacji dla wydajności Pythona.Jeśli musisz ustawić zmienne o zakresie modułu z poziomu modułu, co jest nie tak
global
?a zatem:
źródło
global but not really
deklarację za zagadkową. Przypuszczam, że może to być historyczny relikt, który poprzedza przestrzenie nazw modułów.W Pythonie 3.7 będziesz mógł używać
__getattr__
na poziomie modułu ( powiązana odpowiedź ).Za PEP 562 :
źródło
globals()["SOME_CONSTANT"] = 42
źródło
SOME_CONSTANT
obliczone w czasie wykonywania nie jest dokładnie stałe. A jeśliglobals()
nie jest dla Ciebie dostępny, musisz sięgnąć do innego modułu, aby zmodyfikować jego atrybuty; to z pewnością sprawi, że ludzie zaczną się zastanawiać.