Ответ 1
Python не обрабатывается предварительно. Вы можете просто создать файл myconstants.py
:
MY_CONSTANT = 50
И импортирование их будет работать:
import myconstants
print myconstants.MY_CONSTANT * 2
В 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 секунды.
Python не обрабатывается предварительно. Вы можете просто создать файл myconstants.py
:
MY_CONSTANT = 50
И импортирование их будет работать:
import myconstants
print myconstants.MY_CONSTANT * 2
Python не имеет препроцессора и не имеет констант в том смысле, что их нельзя изменить - вы всегда можете изменить (почти, вы можете эмулировать постоянные свойства объекта, но делаете это ради констант- редко делается и не считается полезным). Определяя константу, мы определяем имя, которое имеет верхний регистр с подчеркиванием и называет его днем: "Мы все соглашаемся с взрослыми здесь", ни один нормальный человек не изменит константу. Если, конечно, он не имеет очень веских причин и точно знает, что он делает, и в этом случае вы не можете (и, возможно, не должны) останавливать его в любом случае.
Но, конечно, вы можете определить имя уровня модуля со значением и использовать его в другом модуле. Это не относится к константам или чему-либо, читайте в модульной системе.
# a.py
MY_CONSTANT = ...
# b.py
import a
print a.MY_CONSTANT
Конечно, вы можете поместить свои константы в отдельный модуль. Например:
const.py:
A = 12
B = 'abc'
C = 1.2
main.py:
import const
print const.A, const.B, const.C
Обратите внимание, что как указано выше, A
, B
и C
являются переменными, то есть могут быть изменены во время выполнения.
И, конечно же, вы можете сделать:
# a.py
MY_CONSTANT = ...
# b.py
from a import *
print MY_CONSTANT
В качестве альтернативы использованию подхода импорта, описанного в нескольких ответах, посмотрите configparser.
В классе ConfigParser реализован базовый язык синтаксического анализатора, который обеспечивает структуру, аналогичную структуре файлов Microsoft INI INI. Вы можете использовать это для написания программ Python, которые могут быть легко настроены конечными пользователями.
Попробуйте выглядеть Создавать константы, используя "настройки" . 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. Это позволит вам убедиться, что значение не будет изменено, удалено.
Если вам действительно нужны константы, а не только переменные, похожие на константы, стандартный способ сделать это - использовать неизменяемые словари. К сожалению, он еще не встроен, поэтому вам нужно использовать сторонние рецепты (например, этот или этот.