2011-12-30 21 views
5

Zastanawiasz się, czy ktoś miał jakiekolwiek przemyślenia na temat użycia globalnego Pythona w porównaniu do samego modułu. Podczas gdy w przeszłości Kiedyś globalny, gdy są potrzebne, znalazłem to nieco jaśniejsze zrobić drugą metodę (a ostatnio mają tendencję do faworyzowania tej składni):Python używa globalnego vs określając moduł

import sys 
mod = sys.modules[__name__] 

counter = 0 

def incrementGlobal(): 
    global counter 
    counter += 1 

def incrementMod(): 
    mod.counter += 1 

Oczywiście oboje pracują dobrze, ale jeśli ktoś ma jakieś mocne opinie (co jest bardziej pythonic, wydajność itp.), chciałbym je usłyszeć.

Btw I kończy się przy użyciu jednego z nich w sytuacjach, gdy moduł naturalnie hermetyzuje wszystkie metody i atrybuty, co byłoby jednej klasy, a zamiast odniesienia incrementmodule.IncrementClass.counter mogę po prostu użyć incrementmodule.counter.

+2

W jaki sposób drugi jest bardziej przejrzysty? – delnan

+0

Domyślam się, że to nie jest tak jasne, ale wolę, ponieważ zmienna na poziomie modułu jest modyfikowana, a nie lokalna (nie musisz sprawdzać, czy zmienna znajduje się w deklaracji globals u góry) – gnr

+3

Jeśli 'globalny' i przypisanie są tak daleko, masz gorsze problemy z jasnością niż;) – delnan

Odpowiedz

5

Idź za global za każdym razem. Słowo kluczowe global jest oczywistym i łatwo rozpoznawalnym wzorcem do modyfikacji czegoś na poziomie modułu. Nadanie modułowi odniesienia do niego z sys.modules wydaje się niepotrzebnie zawiłym sposobem obejścia tego i prawdopodobnie zmyli następnego programistę, który na to patrzy.

3
  • Wydajność: przy użyciu stylu global będzie kiedykolwiek tak lekko szybciej, ponieważ potrzebuje ona tylko jedna nazwa odnośnika zamiast dwóch (będzie tylko kwestią w ciasnej pętli wielu wielu tysiącach).

  • Styl: styl mod.xxx odzwierciedla sposób, by uzyskać dostęp globalnych z innym modułem, który trzeba było przywożone:

`

import foo 
foo.eggs = 'scrambled' 

Sposób global jest bardziej powszechne, ale twój mod.xxx Metoda jest również łatwa do zrozumienia i bardzo czytelna.

+2

Bez uwzględnienia, ale użycie 'global' jest dużo bardziej powszechne niż użycie' mod.xxx', więc argumentowałbym, że użycie 'global' jest bardziej czytelne, ponieważ prawie wszyscy tego oczekują. – EOL

+0

@EOL: Uzgodniono, że "globalna" jest dominującą metodą, a tym bardziej rozpoznawalną. –