Chcę zdefiniować stałą, która powinna być dostępna we wszystkich podmodułach pakietu. Pomyślałem, że najlepszym miejscem będzie __init__.py
plik pakietu głównego. Ale nie wiem, jak to zrobić. Załóżmy, że mam kilka podpakietów, z których każdy zawiera kilka modułów. Jak mogę uzyskać dostęp do tej zmiennej z tych modułów?
Oczywiście, jeśli jest to całkowicie błędne i istnieje lepsza alternatywa, chciałbym to wiedzieć.
from . import MY_CONSTANT
from mypackage.constants import *
MY_CONSTANT
MY_CONSTANT
w którymkolwiek z modułów, zmutowałoby to wszędzie. Jeśli miałbyś ponownie przypisaćMY_CONSTANT
w którymkolwiek z modułów, wpłynęłoby to tylko na ten moduł. Jeśli taki jest Twój zamiar, musisz odwoływać się za pomocą atrybutu, tjmypackage.constants.MY_CONSTANT
.mymodule.py
w__init__.py
wcześniejMY_CONSTANT = 42
, że nie uda, ponieważ podczas importowaniamymodule.py
MY_CONSTANT
nie została jeszcze określona. Więc trzeba iśćMY_CONSTANT = 42
wyżejimport mymodule
Nie możesz tego zrobić. Będziesz musiał jawnie zaimportować swoje stałe do przestrzeni nazw każdego modułu. Najlepszym sposobem na osiągnięcie tego jest zdefiniowanie stałych w module „config” i zaimportowanie ich wszędzie tam, gdzie jest to potrzebne:
źródło
sys.modules
.Możesz definiować zmienne globalne z dowolnego miejsca, ale to naprawdę zły pomysł. importuj
__builtin__
moduł i modyfikuj lub dodawaj atrybuty do tych modułów, a nagle masz nowe wbudowane stałe lub funkcje. W rzeczywistości, kiedy moja aplikacja instaluje gettext, otrzymuję funkcję _ () we wszystkich moich modułach, bez importowania czegokolwiek. Jest to więc możliwe, ale oczywiście tylko dla projektów typu aplikacji, a nie dla pakietów lub modułów wielokrotnego użytku.I chyba nikt nie poleciłby tej praktyki. Co jest nie tak z przestrzenią nazw? Wspomniana aplikacja posiada moduł wersji, tak że mam „globalne” zmienne dostępne jak
version.VERSION
,version.PACKAGE_NAME
etc.źródło
Chciałem tylko dodać, że stałe można zastosować za pomocą pliku config.ini i przeanalizować je w skrypcie przy użyciu biblioteki configparser. W ten sposób możesz mieć stałe dla wielu okoliczności. Na przykład, jeśli masz stałe parametrów dla dwóch oddzielnych żądań adresu URL, po prostu oznacz je w ten sposób:
Dokumentacja na stronie Pythona okazała się bardzo pomocna. Nie jestem pewien, czy są jakieś różnice między Pythonem 2 i 3, więc oto linki do obu:
Python 3: https://docs.python.org/3/library/configparser.html#module-configparser
Python 2: https://docs.python.org/2/library/configparser.html#module-configparser
źródło