2010-10-12 10 views
6

Widziałem ludzi używa małpa-łatanie ustawić opcje na module, na przykład:Python: Jaki jest zalecany sposób ustawienia ustawień modułu podczas jego importowania?

import mymodule
mymodule.default_img = "/my/file.png"
mymodule .view_default_img()

I Django, na przykład, ma settings.py dla całej aplikacji Django, i zawsze mnie to trochę tnie.

Jakie są inne sposoby zarządzania ustawieniami konfiguracyjnymi w module? Co jest zalecane? Wygląda na to, że często nie ma dobrego sposobu na skonfigurowanie konfiguracji na poziomie modułów.

Oczywiście całkowicie unikanie konfiguracji jest zdecydowanie najkorzystniejsze i zwykle lepiej jest używać klas lub przekazywać argumenty do funkcji. Czasem jednak nie można uniknąć pewnych ustawień, a czasami naprawdę ma sens mieć globalne ustawienia dla całego modułu tylko dla wygody (na przykład system szablonów Django - określenie ścieżki bazowej dla każdego szablonu byłoby koszmar, zdecydowanie nie dobry kod DRY).

Odpowiedz

3

Jedną opcją jest moduł ConfigParser. Możesz mieć ustawienia w pliku konfiguracyjnym innym niż python i kazać modułowi odczytać jego ustawienia. Inną opcją jest posiadanie w każdym module metody konfiguracji, którą kod klienta może przekazać również swoim argumentom.

# foo.py 
setting1 = 0 
setting2 = 'foo' 

def configure(config1, config2): 
    global setting1, setting2 

    setting1 = config1 
    setting2 = config2 

Następnie w module przywozu,

import foo 

foo.configure(42, 'bar') 

Osobiście uważam, że najlepszym sposobem na to jest plik z ustawieniami jak Django.

+0

Osobiście uważam, że najgorszym sposobem jest plik ustawień, taki jak django. Ale +1 za wspominanie o ConfigParser. –

+2

Właściwie, nie powiedziałem zbyt dobrze mojego pytania. Kiedy powiedziałem "ustawienia konfiguracji dla modułu" miałem na myśli w Pythonie. Być może lepsze pytanie: kiedy importujesz moduł, jaki jest najlepszy sposób na ustawienie stanu/parametrów na poziomie modułu w środowisku wykonawczym, w Pythonie? Na przykład, kiedy tworzysz instancję klasy, popularnym pythonic sposobem ustawiania stanu klasy jest parametr z funkcją __init__. Jaka jest funkcja __init__ dla modułu? – bryhoyt

+1

Co więcej, ponieważ łatwo jest umieścić kod runtime bezpośrednio w module, np. Funkcję __init__, w jaki sposób przekazać parametry do modułów "__init__"? – bryhoyt

Powiązane problemy