Czy w Pythonie istnieje odpowiednik instrukcji C
preprocesora, na przykład ?:
#define MY_CONSTANT 50
Mam również dużą listę stałych, które chciałbym zaimportować do kilku klas. Czy istnieje analogia do zadeklarowania stałych jako długiej sekwencji instrukcji, takich jak powyższe, w .py
pliku i zaimportowania ich do innego .py
pliku?
Edytować.
Plik Constants.py
czyta:
#!/usr/bin/env python
# encoding: utf-8
"""
Constants.py
"""
MY_CONSTANT_ONE = 50
MY_CONSTANT_TWO = 51
I myExample.py
czyta:
#!/usr/bin/env python
# encoding: utf-8
"""
myExample.py
"""
import sys
import os
import Constants
class myExample:
def __init__(self):
self.someValueOne = Constants.MY_CONSTANT_ONE + 1
self.someValueTwo = Constants.MY_CONSTANT_TWO + 1
if __name__ == '__main__':
x = MyClass()
Edytować.
Z kompilatora
NameError: „nazwa globalna„ MY_CONSTANT_ONE ”nie jest zdefiniowana”
function init w myExample w linii 13 self.someValueOne = Constants.MY_CONSTANT_ONE + 1 wyjście kopiowania Program zakończył działanie z kodem # 1 po 0,06 sekundy.
python myExample.py
powinien zapewnić śledzenie błędów, które obejmują nazwy plików i<module>
najwyższy poziom. PozaMY_CONSTANT_ONE
tym odniesienia nie są nazwą globalną - naprawdę dziwne. Potrójnie sprawdź, czy to naprawdę są pliki, które uruchamiasz (i być może przekonwertuj je na ASCII i usuń# encoding: utf8
fragment).Odpowiedzi:
Python nie jest wstępnie przetwarzany. Możesz po prostu utworzyć plik
myconstants.py
:MY_CONSTANT = 50
Importowanie ich po prostu zadziała:
import myconstants print myconstants.MY_CONSTANT * 2
źródło
MAX_FIVE_FLUSH_KEY_INT
). Opublikuj śledzenie.Python nie ma preprocesora, ani nie ma stałych w tym sensie, że nie można ich zmienić - zawsze możesz zmienić (prawie, możesz emulować stałe właściwości obiektu, ale robienie tego ze względu na stałość rzadko jest zrobione i nieprzydatne) wszystko. Definiując stałą, definiujemy nazwę, która jest pisana dużymi literami z podkreśleniem i nazywamy ją dniem - „Wszyscy tu jesteśmy dorosłymi na zgodę”, żaden rozsądny człowiek nie zmieni stałej. Chyba że ma bardzo dobre powody i dokładnie wie, co robi, w takim przypadku nie możesz (i prawdopodobnie nie powinieneś) go powstrzymać.
Ale oczywiście możesz zdefiniować nazwę poziomu modułu za pomocą wartości i użyć jej w innym module. Nie jest to specyficzne dla stałych ani niczego, przeczytaj w systemie modułów.
# a.py MY_CONSTANT = ... # b.py import a print a.MY_CONSTANT
źródło
I oczywiście możesz:
# a.py MY_CONSTANT = ... # b.py from a import * print MY_CONSTANT
źródło
import *
jest z diabła.Jasne, możesz umieścić swoje stałe w osobnym module. Na przykład:
const.py:
A = 12 B = 'abc' C = 1.2
main.py:
import const print const.A, const.B, const.C
Należy zauważyć, że zgodnie z oświadczeniem powyżej
A
,B
iC
są zmienne, to znaczy mogą być zmieniane w czasie wykonywania.źródło
Spróbuj spojrzeć Utworzyć stałe za pomocą modułu „ustawienia”? i czy mogę zapobiec modyfikowaniu obiektu w Pythonie?
Kolejny przydatny link: http://code.activestate.com/recipes/65207-constants-in-python/ informuje nas o następującej opcji:
from copy import deepcopy class const(object): def __setattr__(self, name, value): if self.__dict__.has_key(name): print 'NO WAY this is a const' # put here anything you want(throw exc and etc) return deepcopy(self.__dict__[name]) self.__dict__[name] = value def __getattr__(self, name, value): if self.__dict__.has_key(name): return deepcopy(self.__dict__[name]) def __delattr__(self, item): if self.__dict__.has_key(item): print 'NOOOOO' # throw exception if needed CONST = const() CONST.Constant1 = 111 CONST.Constant1 = 12 print a.Constant1 # 111 CONST.Constant2 = 'tst' CONST.Constant2 = 'tst1' print a.Constant2 # 'tst'
Możesz więc stworzyć taką klasę, a następnie zaimportować ją z modułu contants.py. Pozwoli to mieć pewność, że wartość nie zostanie zmieniona, usunięta.
źródło
Jako alternatywę dla metody importowania opisanej w kilku odpowiedziach, zajrzyj do modułu configparser .
Klasa ConfigParser implementuje podstawowy język parsera plików konfiguracyjnych, który zapewnia strukturę podobną do tej, którą można znaleźć w plikach INI systemu Microsoft Windows. Możesz użyć tego do pisania programów w Pythonie, które mogą być łatwo dostosowywane przez użytkowników końcowych.
źródło
Jeśli naprawdę potrzebujesz stałych, a nie tylko zmiennych, które wyglądają jak stałe, standardowym sposobem jest użycie niezmiennych słowników. Niestety nie jest jeszcze wbudowany, więc musisz użyć przepisów innych firm (takich jak ten lub inny ).
źródło
stwórz stały plik o dowolnej nazwie, takiej jak my_constants.py deklaruj stałą w ten sposób
CONSTANT_NAME = "SOME VALUE"
Aby uzyskać dostęp do stałej w pliku importu kodu w ten sposób
import my_constants as constant
i uzyskaj stałą wartość jako -
źródło