W niektórych moich aplikacjach Django używam pliku settings_local.py
, aby nadpisać ustawienia, które różnią się w różnych środowiskach (np. Programowanie, testowanie i produkcja). Ja pierwotnie używany następujący kod do włączenia jej zawartość w settings.py
:Python: 'import *' vs execfile
try:
from settings_local import *
except ImportError:
sys.stderr.write("The settings_local.py file is missing.\n")
DEBUG=False
Niedawno znaleziono funkcję execfile
i włączony do czegoś podobnego:
try:
execfile(path.join(PROJECT_ROOT, "settings_local.py"))
except IOError:
sys.stderr.write("The settings_local.py file is missing.\n"
DEBUG=False
zarówno do pracy zgodnie z przeznaczeniem, ale I” Jestem ciekawy, czy brakuje mi gotchów, i ogólnie, które podejście jest bardziej zalecane i dlaczego.
'__file__' można łatwo podać za pomocą argumentów. Główna różnica polega na tym, że moduł jest importowany dokładnie raz, bez względu na to ile razy 'moduł importujący' jest wykonywany (' exec' wykonuje plik za każdym razem, gdy jest wywoływany), a 'import' nie wymaga jawnej ścieżki do pliku (więc działałoby również w archiwum zip). – jfs
@ J.F.Sebastian To powinno być odpowiedzią. – Marcin
Jedną z zalet, którą znalazłem na temat execfile (w przeciwieństwie do importu) jest to, że mogę to robić dynamicznie. W szczególności, jeśli mam listę modułów ustawień, mogę wykonać pętlę na liście, wywołując execfile na każdym z nich. Czy istnieje sposób na zrobienie tego za pomocą importu? –