Импорт длинного списка констант в файл Python - PullRequest
63 голосов
/ 14 июня 2011

В 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 = Constants.MY_CONSTANT_ONE + 1 копия вывода Программа завершена с кодом # 1 через 0,06 секунды.

Ответы [ 7 ]

90 голосов
/ 14 июня 2011

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

MY_CONSTANT = 50

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

import myconstants
print myconstants.MY_CONSTANT * 2
14 голосов
/ 14 июня 2011

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

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

# a.py
MY_CONSTANT = ...

# b.py
import a
print a.MY_CONSTANT
8 голосов
/ 14 июня 2011

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

# a.py
MY_CONSTANT = ...

# b.py
from a import *
print MY_CONSTANT
7 голосов
/ 14 июня 2011

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

const.py:

A = 12
B = 'abc'
C = 1.2

main.py:

import const

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

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

4 голосов
/ 14 июня 2011

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

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

3 голосов
/ 14 июня 2011

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

1 голос
/ 14 июня 2011

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

...