Подтвердить что ты не робот

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

В 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 секунды.

4b9b3361

Ответ 1

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

MY_CONSTANT = 50

И импортирование их будет работать:

import myconstants
print myconstants.MY_CONSTANT * 2

Ответ 2

Python не имеет препроцессора и не имеет констант в том смысле, что их нельзя изменить - вы всегда можете изменить (почти, вы можете эмулировать постоянные свойства объекта, но делаете это ради констант- редко делается и не считается полезным). Определяя константу, мы определяем имя, которое имеет верхний регистр с подчеркиванием и называет его днем: "Мы все соглашаемся с взрослыми здесь", ни один нормальный человек не изменит константу. Если, конечно, он не имеет очень веских причин и точно знает, что он делает, и в этом случае вы не можете (и, возможно, не должны) останавливать его в любом случае.

Но, конечно, вы можете определить имя уровня модуля со значением и использовать его в другом модуле. Это не относится к константам или чему-либо, читайте в модульной системе.

# a.py
MY_CONSTANT = ...

# b.py
import a
print a.MY_CONSTANT

Ответ 3

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

const.py:

A = 12
B = 'abc'
C = 1.2

main.py:

import const

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

Обратите внимание, что как указано выше, A, B и C являются переменными, то есть могут быть изменены во время выполнения.

Ответ 4

И, конечно же, вы можете сделать:

# a.py
MY_CONSTANT = ...

# b.py
from a import *
print MY_CONSTANT

Ответ 5

В качестве альтернативы использованию подхода импорта, описанного в нескольких ответах, посмотрите configparser.

В классе ConfigParser реализован базовый язык синтаксического анализатора, который обеспечивает структуру, аналогичную структуре файлов Microsoft INI INI. Вы можете использовать это для написания программ Python, которые могут быть легко настроены конечными пользователями.

Ответ 6

Попробуйте выглядеть Создавать константы, используя "настройки" . module? и Могу ли я предотвратить изменение объекта в 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. Это позволит вам убедиться, что значение не будет изменено, удалено.

Ответ 7

Если вам действительно нужны константы, а не только переменные, похожие на константы, стандартный способ сделать это - использовать неизменяемые словари. К сожалению, он еще не встроен, поэтому вам нужно использовать сторонние рецепты (например, этот или этот.