Імпорт довгого списку констант у файл Python


90

Чи існує в Python аналог Cоператора препроцесора, такий як ?:

#define MY_CONSTANT 50

Крім того, у мене є великий список констант, які я хотів би імпортувати до кількох класів. Чи існує аналог оголошення констант як довгої послідовності тверджень, подібних до вищезазначених, у .pyфайлі та імпортування їх до іншого .pyфайлу?

Редагувати.

Файл Constants.pyчитає:

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

MY_CONSTANT_ONE = 50
MY_CONSTANT_TWO = 51

І myExample.pyчитає:

#!/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()

Редагувати.

З компілятора,

NameError: "глобальне ім'я" MY_CONSTANT_ONE "не визначено"

функція init в myExample у рядку 13 self.someValueOne = Константи.MY_CONSTANT_ONE + 1 вивід копії Програма вийшла з кодом # 1 через 0,06 секунди.


2
Ні, препроцесора немає. І ні, ви не зайдете дуже далеко, намагаючись кодувати C на Python, або навіть намагаючись знайти паралелі.

Це ще не повний зворотний зв'язок. Як ти працюєш? python myExample.pyповинен дати зворотний зв'язок про помилку, яка включає імена файлів і <module>як верхній рівень. Плюс, MY_CONSTANT_ONE чи не є посилання як глобальна назва - насправді дивно. Тричі перевірте, чи це справді файли, які ви запускаєте (і, можливо, перетворіть їх у ASCII та розітріть # encoding: utf8біт).

@ All: Дякую, мені здається, зараз все добре - ще не впевнений, чому, але неважливо :).
SK9

Відповіді:


131

Python не попередньо оброблений. Ви можете просто створити файл myconstants.py:

MY_CONSTANT = 50

І їх імпорт буде просто працювати:

import myconstants
print myconstants.MY_CONSTANT * 2

@ SK9: Ну, покажіть точний код, який ви використовуєте (як визначаючи, так і використовуючи модуль).

@Thomas: Див. Вище. Я, безумовно, щось пропустив, коли вивчаю основи.
SK9

@ SK9: У коді, який ви опублікували, немає такої помилки. Я перевірив це кілька разів і запустив сам, він працює чудово. Це навіть не може призвести до цієї помилки (посилання на ім’я немає MAX_FIVE_FLUSH_KEY_INT). Опублікувати зворотний зв'язок.

@Thomas: Дякую за тестування цього. Хм, спробую ще раз. (Посилання, про яке йдеться, - це друкарська помилка.) Ви пробували файли буквально як є? (Я скопіював і вставив повний вміст вище.)
SK9

@ SK9: Я не Томас;) І так, я все скопіював і вставив, навіть залишив імена файлів такими, які вони є. Знову ж таки, відстеження допоможе нам налагодити.

18

Python не має попереднього процесора, а також не має констант у тому сенсі, що їх не можна змінити - ви завжди можете змінити (майже, ви можете емулювати властивості постійних об'єктів, але робити це заради постійності не рідко зроблено і не вважається корисним) все. Визначаючи константу, ми визначаємо ім’я, яке прописується великими літерами та підкреслюється, і називаємо це днем ​​- «Ми всі тут погоджуємось для дорослих», жоден здоровий чоловік не змінить константу. Якщо, звичайно, він не має поважних причин і точно не знає, що робить, у такому випадку ви не можете (і, мабуть, не повинні) зупинити його в будь-якому випадку.

Але, звичайно, ви можете визначити назву рівня модуля зі значенням і використовувати його в іншому модулі. Це не стосується констант або чогось іншого, читайте в системі модулів.

# a.py
MY_CONSTANT = ...

# b.py
import a
print a.MY_CONSTANT

11

І звичайно, ви можете зробити:

# a.py
MY_CONSTANT = ...

# b.py
from a import *
print MY_CONSTANT


3
імпорт * загалом не рекомендується, але маніфестні константи у стилі С, які широко використовуються в кодовій базі, є одним із місць, де використовувати його не божевільно. Присвоєння їх імені ALL_CAPS або з деякими умовами префіксів, що зменшує можливість зіткнення з іншими символами, усуває основне заперечення ідіоми, а якщо зіткнення трапляється, ви завжди можете повернутися до звичайного стилю імпорту + явного імені (import a; .MY_CONSTNAT), на відміну від C.
Рассел Борогове

також a.MY_CONSTNAT трохи повільніше, це тому, що інтерпретатор шукає в одному просторі імен ім'я 'a', а потім у другому імені ворога 'MY_CONSTNAT'
Тоні

7

Звичайно, ви можете помістити свої константи в окремий модуль. Наприклад:

const.py:

A = 12
B = 'abc'
C = 1.2

main.py:

import const

print const.A, const.B, const.C

Слід зазначити , що , як заявлено вище, A, Bі Cє змінними, тобто може бути змінений під час виконання.


5

Спробуйте подивитися Створити константи за допомогою модуля "налаштування"? та чи можу я запобігти зміні об'єкта в Python?

Ще одне корисне посилання: http://code.activestate.com/recipes/65207-constants-in-python/ говорить нам про такий варіант:

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'

Тож ви можете створити такий клас, а потім імпортувати його з вашого модуля Contants.py. Це дозволить вам бути впевненим, що значення не буде змінено, видалено.


Дякую за це. Перш ніж запитати про SO, я шукав і знайшов обидва. :)
SK9

@ SK9 ой, вибачте за дублікат тоді
Артьом Рудзенка

4

Як альтернативу використанню підходу імпорту, описаного в декількох відповідях, подивіться модуль configparser .

Клас ConfigParser реалізує базову мову синтаксичного аналізатора файлів конфігурації, яка забезпечує структуру, подібну до тієї, яку ви знайдете у файлах INI Microsoft Windows. Ви можете використовувати це для написання програм Python, які можуть бути легко налаштовані кінцевими користувачами.


2

Якщо ви дійсно хочете константи, а не лише змінні, що виглядають як константи, стандартним способом цього є використання незмінних словників. На жаль, це ще не вбудовано, тому вам доведеться використовувати сторонні рецепти (наприклад, цей чи той ).


2

створити файл константи з будь-яким ім'ям, наприклад my_constants.py оголосити константу таким чином

CONSTANT_NAME = "SOME VALUE"

Для отримання доступу до константи у файлі імпорту коду таким чином

import my_constants as constant

і отримати доступ до постійного значення як -

constant.CONSTANT_NAME
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.