5

Przy deklarowaniu stałej, która jest używana tylko jedna funkcja, czy ta zmienna powinna być zadeklarowana lokalnie, ponieważ jest używana tylko przez tę funkcję, czy globalnie, ponieważ nigdy się nie zmieni?(python) Czy moja zmienna powinna być lokalna czy globalna? (najlepsza praktyka)

IE, co jest lepsze:

CONSTANT = (1, 3, 5, 8) 

##SOME OTHER CODE HERE 

def function1(arg): 
    if arg in CONSTANT: 
     do something 

czyli

def function1(arg): 
    CONSTANT = (1, 3, 5, 8) 
    if arg in CONSTANT: 
     do something 

wiem, że nie jest dużo różnica między tymi dwoma, ale chciałem tylko wiedzieć, które z tych dwóch praktyk jest preferowany, ponieważ dopiero zaczynam i chcę tworzyć dobre nawyki.

+1

Dobre pytanie. :) Ale czy 'CONSTANT' jest używany więcej niż jeden raz? przykład sugeruje, że nie, ale możesz to wyjaśnić. Jeśli używasz go tylko raz, prawie nie ma potrzeby nadawania mu nazwy, więc możesz chcieć pokazać, że naprawdę zamierzasz go używać wielokrotnie w funkcji. – EOL

+0

Osobiście wolę nazywać rzeczy, nawet jeśli nie sądzę, że zamierzam ich użyć dwa razy, zwykle z miłym komentarzem wyjaśniającym, co oznacza stała. Jestem zwolenniczką nie używania literałów w moich wyrażeniach, * zwłaszcza * jeśli są używane więcej niż jeden raz. Ale w przypadkach, w których są używane dokładnie raz, widzę to na swój sposób. – acjay

Odpowiedz

3

Utrzymałbym to lokalnie. Zawsze możesz po prostu przenieść ją globalnie w przyszłości, jeśli potrzebujesz, lub dzielić się nią między funkcjami, czyniąc je metodami w klasie i zmieniając stałą w zmienną klasy. W takich sytuacjach, mówiąc ogólnie, im bardziej lokalnie, tym lepiej i najlepiej jest ukryć informacje dotyczące implementacji w ramach twoich funkcji, jak w twoim drugim przykładzie. Nie ma tu wielkiej różnicy, ale wraz ze wzrostem twoich projektów utrzyma się łatwość konserwacji i modułowość.

+0

Czy stała jest tworzona tylko raz w wersji lokalnej lub raz na połączenie? –

+1

@JoachimIsaksson: Zostanie utworzony tylko raz, gdy plik zostanie załadowany. Pozostanie w pamięci. –

+1

Nawet jeśli wartość jest tworzona tylko raz, jest ona ponownie zapisywana w zmiennej 'CONSTANT' przy każdym wykonaniu (z CPython 2.7.3). Można to zobaczyć poprzez 'dis.dis()'. – EOL

1

chciałbym umieścić je globalny, ponieważ:

  1. Twoje zmiennychstałe
  2. W Pythonie globalny zakres jest zamknięty w przestrzeni nazw modułu, co oznacza, że ​​zmienna jest w rzeczywistości tylko globalny wewnątrz modułu.
  3. Jeśli wielokrotnie wywołasz swoją funkcję i umieścisz w niej stałe, to będzie ona przypisywać je za każdym razem, gdy wywołasz tę funkcję.
  4. Następnie możesz udostępniać swoje stałe między różnymi funkcjami.

Jeśli jednak przejdziesz do programowania zorientowanego obiektowo, umieściłbym stałe jako zmienne klasy.

+1

Stałe są * nie * ponownie przydzielane za każdym razem. Są one przydzielane jeden raz i przywoływane jako odniesienie. –

+1

Dla (1), nie jestem pewien, czy rozumiem. Dla (2), oczywiście, zmienne modułu nie są "globalne" jak wbudowane, ale to jest poza tym punktem. Te same podstawowe argumenty przeciwko prawdziwie globalnym zmiennym mają zastosowanie na dowolnym poziomie zasięgu powyżej lokalnego, w mniejszym stopniu. Rozszerz tę logikę do projektu z setkami funkcji i zaczniesz mieć bałagan zmiennych, które nie są tak bardzo zbliżone do rzeczywistego kodu, który się nimi zajmuje. Funkcja zaczyna znikać, pozostawiając za sobą niezajęte stałe. Dla mnie (3) to przedwczesna optymalizacja i (4) to YAGNI. – acjay

0

Powiedziałbym, że to, co najlepsze zależy od sytuacji:.

Jeśli czas realizacji nie jest problemem, to za każdym razem, gdy stała jest ładowana do nowej zmiennej, nie traci dużo czasu. Ma to oczywistą zaletę polegającą na wyraźnym pokazaniu, gdzie w kodzie używana jest stała.

W przeciwnym razie ustawienie globalne jest w porządku, ale zrobiłbym to tylko dla celów optymalizacji. Jeśli o tym myślę, to jest to jedyny powód, dla którego zadałem sobie to samo pytanie.

Mogą istnieć inne powody, aby skorzystać globalny:

  • jeśli użytkownik programu często musi zmienić swoją wartość w kodzie i nie chcesz, aby przeanalizować argumenty programu,
  • jeśli inne programy potrzebują do niego dostępu,
  • itd.

Podsumowując, powiedziałbym: rób to, co uważasz za najlepsze, ale staraj się hermetyzować rzeczy tak, jak to możliwe, gdzie one należą (lokalni mają być woli od globałów).

Powiązane problemy