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.


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

@ 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

11

I oczywiście możesz:

# a.py
MY_CONSTANT = ...

# b.py
from a import *
print MY_CONSTANT


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.


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.


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.


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


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.