协慌网

登录 贡献 社区

如何在 Python 中创建常量?

有没有办法在 Python 中声明一个常量?在 Java 中,我们可以用这种方式创建常量值:

public static final String CONST_NAME = "Name";

Python 中上述 Java 常量声明的等价物是什么?

答案

不,那里没有。您不能在 Python 中将变量或值声明为常量。只是不要改变它。

如果你在一个班级,相当于:

class Foo(object):
    CONST_NAME = "Name"

如果没有,那就是

CONST_NAME = "Name"

但是你可能想看看 Alex Martelli 的Python代码片段常量

在其他语言中没有const关键字,但是可以创建一个具有 “getter 函数”来读取数据的 Property,但是没有 “setter 函数”来重写数据。 这实质上保护标识符不被更改。

以下是使用 class 属性的替代实现:

请注意,对于想知道常量的读者而言,代码并不容易。见下面的解释

def constant(f):
    def fset(self, value):
        raise TypeError
    def fget(self):
        return f()
    return property(fget, fset)

class _Const(object):
    @constant
    def FOO():
        return 0xBAADFACE
    @constant
    def BAR():
        return 0xDEADBEEF

CONST = _Const()

print CONST.FOO
##3131964110

CONST.FOO = 0
##Traceback (most recent call last):
##    ...
##    CONST.FOO = 0
##TypeError: None

代码说明:

  1. 定义一个接受表达式的函数constant ,并使用它来构造一个 “getter” - 一个只返回表达式值的函数。
  2. setter 函数引发 TypeError,因此它是只读的
  3. 使用我们刚刚创建的constant函数作为装饰来快速定义只读属性。

而在其他一些更老式的方式:

(代码非常棘手,下面有更多解释)

class _Const(object):
    @apply
    def FOO():
        def fset(self, value):
            raise TypeError
        def fget(self):
            return 0xBAADFACE
        return property(**locals())

CONST = _Const()

print CONST.FOO
##3131964110

CONST.FOO = 0
##Traceback (most recent call last):
##    ...
##    CONST.FOO = 0
##TypeError: None

请注意,@ apply 装饰器似乎已被弃用。

  1. 要定义标识符 FOO,firs 定义两个函数(fset,fget - 名称由我选择)。
  2. 然后使用内置property函数构造一个可以 “设置” 或 “获取” 的对象。
  3. 注意, property函数的前两个参数名为fsetfget
  4. 使用我们为我们自己的 getter 和 setter 选择这些名称的事实,并使用应用于该作用域的所有本地定义的 **(双星号)创建关键字字典,以将参数传递给property函数

在 Python 而不是语言强制实施的东西中,人们使用命名约定,例如__method用于私有方法,并使用_method用于受保护的方法。

因此,以同样的方式,您可以简单地将常量声明为全部大写,例如

MY_CONSTANT = "one"

如果你想要这个常量永远不会改变,你可以挂钩属性访问并做一些技巧,但更简单的方法是声明一个函数

def MY_CONSTANT():
    return "one"

只有问题无处不在,你必须做 MY_CONSTANT(),但是再次MY_CONSTANT = "one"是 python 中的正确方法(通常)。

您还可以使用namedtuple来创建常量:

>>> from collections import namedtuple
>>> Constants = namedtuple('Constants', ['pi', 'e'])
>>> constants = Constants(3.14, 2.718)
>>> constants.pi
3.14
>>> constants.pi = 3
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: can't set attribute