Importowanie długiej listy stałych do pliku Pythona

90

Czy w Pythonie istnieje odpowiednik instrukcji Cpreprocesora, 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 .pypliku i zaimportowania ich do innego .pypliku?

Edytować.

Plik Constants.pyczyta:

#!/usr/bin/env python
# encoding: utf-8
"""
Constants.py
"""

MY_CONSTANT_ONE = 50
MY_CONSTANT_TWO = 51

I myExample.pyczyta:

#!/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.

SK9
źródło
2
Nie, nie ma preprocesora. I nie, nie zajdziesz zbyt daleko, próbując kodować C w Pythonie, ani nawet próbując znaleźć podobieństwa.
To nie jest pełny ślad. Jak to prowadzisz? python myExample.pypowinien zapewnić śledzenie błędów, które obejmują nazwy plików i <module>najwyższy poziom. Poza MY_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: utf8fragment).
@ Wszyscy: Dzięki, wydaje mi się, że teraz wszystko w porządku - jeszcze nie wiem dlaczego, ale nieważne :).
SK9

Odpowiedzi:

132

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
Thomas K.
źródło
@ SK9: Cóż, pokaż dokładny kod, który uruchamiasz (zarówno definiując, jak i używając modułu).
@Thomas: Patrz wyżej. Zdecydowanie przegapiłem coś głupiego, gdy uczę się podstaw.
SK9
@ SK9: W opublikowanym kodzie nie ma takiego błędu. Sprawdziłem to kilka razy i sam uruchomiłem, działa dobrze. Nie może nawet doprowadzić do tego błędu (nie ma odniesienia do nazwy MAX_FIVE_FLUSH_KEY_INT). Opublikuj śledzenie.
@Thomas: Dzięki za przetestowanie tego. Hmm, spróbuję jeszcze raz. (Odniesienie, o którym mowa, to literówka). Próbowałeś pliki dosłownie tak, jak jest? (Skopiowałem i wkleiłem całą zawartość powyżej.)
SK9
@ SK9: Nie jestem Thomasem;) I tak, skopiowałem i wkleiłem wszystko, nawet zostawiłem nazwy plików takimi, jakie są. Ponownie, śledzenie pomogłoby nam w debugowaniu.
18

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
11

I oczywiście możesz:

# a.py
MY_CONSTANT = ...

# b.py
from a import *
print MY_CONSTANT
Tony
źródło
3
Funkcja import * jest generalnie odradzana, ale stałe manifestu w stylu C, które są szeroko używane w całej bazie kodu, są jednym z miejsc, w których używanie go nie jest szalone. Nazywanie ich w ALL_CAPS lub z pewną konwencją prefiksów, która zmniejsza możliwość kolizji z innymi symbolami, usuwa główny zarzut idiomu, a jeśli kolizja wystąpi, zawsze możesz wrócić do konwencjonalnego importu + jawny styl nazwy (import a; a .MY_CONSTNAT), w przeciwieństwie do C.
Russell Borogove.
również a.MY_CONSTNAT trochę wolniej, to dlatego, że interpreter szuka w jednej przestrzeni nazw nazwy „a”, a następnie w drugiej nazwie wroga „MY_CONSTNAT”
tony
7

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, Bi Csą zmienne, to znaczy mogą być zmieniane w czasie wykonywania.

NPE
źródło
5

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.

Artsiom Rudzenka
źródło
Dzięki za to. Przed zapytaniem o SO szukałem i znalazłem oba. :)
SK9
@ SK9 och, przepraszam za duplikat
Artsiom Rudzenka
4

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.

Fredrik Pihl
źródło
2

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 ).

vartec
źródło
2

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 -

constant.CONSTANT_NAME
rajanbhadauria
źródło