2012-06-20 14 views
25

Pierwszy użytkownik na przepełnieniu stosu i jestem podekscytowany, że tu jestem.Python - Najlepszy/najczystszy sposób definiowania stałych list lub słowników

INTRO: Niedawno rozpocząłem magiczną przygodę w świecie programowania w języku Python - uwielbiam to. Teraz wszystko poszło gładko w moim niezręcznym przejściu z C, ale mam problem z utworzeniem czegoś, co byłoby równoznaczne z plikiem HEADER (.h).

PROBLEM: Posiadam średnie słowniki i listy (około 1000 elementów), długie wyliczenia i "#defines" (no, naprawdę nie), ale nie mogę znaleźć CZYSTEGO sposobu uporządkowania ich wszystkich. W C, wyrzuciłbym je wszystkie w pliku nagłówkowym i nigdy więcej nie myślę o tym, jednak w Pythonie, co nie jest możliwe lub tak myślę.

AKTUALNE ROZWIĄZANIE DIRTY: Inicjuję wszystkie zmienne CONSTANT u góry MODUŁU lub FUNKCJI (moduł, jeśli potrzebuje tego wiele funkcji).

PODSUMOWANIE: Byłbym zawsze wdzięczny, gdyby ktoś wymyślił sposób CZYSTEJ zorganizowania stałych zmiennych.

DZIĘKUJEMY TAK DUŻO!

+6

Chciałem tylko powiedzieć, witam w Stack, i dziękuję za rozpoczęcie tutaj z dobrze zorganizowanym pytaniem! – jdi

Odpowiedz

19

Umieść swoje stałe do własnego modułu:

# constants.py 

RED = 1 
BLUE = 2 
GREEN = 3 

następnie zaimportować ten moduł i używać stałych:

import constants 

print "RED is", constants.RED 

Stałe może mieć dowolną wartość chcesz, ja pokazano całkowite tutaj , ale listy i dyktury będą działać tak samo.

+0

Świetny pomysł. Czy wiesz, jak wygląda opóźnienie lub utrata wydajności? Ponieważ technicznie go importujesz i czy nie wymaga to sprawdzenia za każdym razem, gdy odwołujesz się do wartości? – TSmith

+0

Wykonujesz wyszukiwanie atrybutów za każdym razem, co jest typem operacji, która dzieje się cały czas w każdym razie, to naprawdę nie jest czymś, o co trzeba się martwić. –

+1

@TSmith: Jeśli jesteś bardzo zajęty goleniem się tego czasu, zawsze możesz zrobić 'from constants import RED' lub przypisać go do zmiennej tuż przed super długą pętlą:' red = constants.RED' – jdi

9

Zazwyczaj robię to:

Plik: constants.py

CONSTANT1 = 'asd' 
CONSTANT_FOO = 123 
CONSTANT_BAR = [1, 2, 5] 

Plik: your_script.py

from constants import CONSTANT1, CONSTANT_FOO 
# or if you want *all* of them 
# from constants import * 

... 

Teraz wasze stałe w jednym pliku i ciebie można ładnie importować i wykorzystywać je.

+0

Dziękuję, CC'ing do pytania efektywności, jeśli możesz pomóc. – TSmith

+0

Po zaimportowaniu ich wszystkie stałe stają się zmiennymi globalnymi i nie wymagają wyszukiwania. Zauważ, że Python jest około 200 razy wolniejszy niż C, więc nie zauważysz znacznego zwiększenia prędkości, jeśli spróbujesz zoptymalizować mikro. – Blender

+0

Dziękuję mikser. Pytanie o szybką ciekawość, jeśli przypiszę zmienną lokalną (w ramach funkcji) do tej zaimportowanej zmiennej globalnej, czy ten lokalny var będzie miał kopię lub odniesienie do globalnej? – TSmith

2

Utwórz osobny plik constants.py i umieść tam wszystkie istotne dla całego świata stałe. Następnie można import constants nazywać je jako constants.SPAM lub wykonać (wątpliwe) from constants import *, aby odnieść się do nich po prostu jako SPAM lub .

Podczas gdy jesteśmy tutaj, zauważ, że Python nie obsługuje stałych stałych. Konwencja polega na nazwaniu ich w ALL_CAPS i obiecuję, że ich nie zmutujemy.

+0

Haha tak, obiecuję :), ale co ze skutecznością czasu pracy? Podczas importowania modułu jest to jak "__inline" w C? – TSmith

+0

@TSmith: Nie porównałbym tego z inline, ponieważ jest to po prostu import do obiektu modułu przestrzeni nazw i robi to tylko raz, i udostępnia go w pamięci dla kolejnych importów. – jdi

+0

Tak, to było głupie pytanie, teraz, gdy o tym myślę. Dziękuję i życzę udanego dnia! – TSmith

Powiązane problemy