Как мне создать константу в Python? - PullRequest
846 голосов
/ 21 апреля 2010

Есть ли способ объявить константу в Python? В Java мы можем создавать постоянные значения следующим образом:

public static final String CONST_NAME = "Name";

Что эквивалентно приведенному выше объявлению константы Java в Python?

Ответы [ 33 ]

0 голосов
/ 27 марта 2017

Вы можете эмулировать постоянные переменные с помощью следующего класса. Пример использования:

# Const
const = Const().add(two=2, three=3)

print 'const.two: ', const.two
print 'const.three: ', const.three

const.add(four=4)

print 'const.four: ', const.four

#const.four = 5 # a error here: four is a constant

const.add(six=6)

print 'const.six: ', const.six

const2 = Const().add(five=5) # creating a new namespace with Const()
print 'const2.five: ', const2.five
#print 'const2.four: ', const2.four # a error here: four does not exist in const2 namespace

const2.add(five=26)

Вызывайте конструктор, когда вы хотите начать новое постоянное пространство имен. Обратите внимание, что класс находится под защитой от неожиданных модифицирующих констант типа последовательности, когда класс Мартелли const не является.

Источник ниже.

from copy import copy

class Const(object):
"A class to create objects with constant fields."

def __init__(self):
    object.__setattr__(self, '_names', [])


def add(self, **nameVals):
    for name, val in nameVals.iteritems():          
        if hasattr(self, name):
            raise ConstError('A field with a name \'%s\' is already exist in Const class.' % name)

        setattr(self, name, copy(val)) # set up getter

        self._names.append(name)

    return self


def __setattr__(self, name, val):
    if name in self._names:
        raise ConstError('You cannot change a value of a stored constant.')

    object.__setattr__(self, name, val)
0 голосов
/ 26 сентября 2013

Расширяя ответ Рауфио, добавьте __repr__, чтобы вернуть значение.

class const(object):
    def __init__(self, val):
        super(const, self).__setattr__("value", val)
    def __setattr__(self, name, val):
        raise ValueError("Trying to change a constant value", self)
    def __repr__(self):
        return ('{0}'.format(self.value))

dt = const(float(0.01))
print dt

тогда объект ведет себя немного больше, чем вы могли ожидать, вы можете получить к нему прямой доступ вместо «.value»

0 голосов
/ 20 января 2015

хорошо .. даже если это устарело, позвольте мне добавить мои 2 цента здесь: -)

class ConstDict(dict):
    def __init__(self, *args, **kwargs):
        super(ConstDict, self).__init__(*args, **kwargs)

    def __setitem__(self, key, value):
        if key in self:
            raise ValueError("Value %s already exists" % (key))
        super(ConstDict, self).__setitem__(key, value)

Вместо взлома ValueError вы можете предотвратить любое обновление, происходящее там. Одним из преимуществ этого является то, что вы можете динамически добавлять константы в программу, но вы не можете изменить их после установки константы. Также вы можете добавить любое правило или что-то еще до установки константы (что-то вроде ключа должно быть строкой или строкой в ​​нижнем регистре или строкой в ​​верхнем регистре и так далее до установки ключа)

Однако я не вижу никакой важности установки констант в Python. Никаких оптимизаций не может быть, как в C, и, следовательно, это то, что не требуется, я думаю.

...