如何在Python中创建常量?

2022-09-05 00:59:26

如何在Python中声明常量?

在Java中,我们这样做:

public static final String CONST_NAME = "Name";

答案 1

不能在 Python 中将变量或值声明为常量。


为了向程序员指示变量是常量,通常以大写形式编写它:

CONST_NAME = "Name"

要在常量更改时引发异常,请参阅 Alex Martelli 的 Python 中的常量。请注意,这在实践中并不常用。


从Python 3.8开始,有一个类型。最终的变量注释,它将告诉静态类型检查器(如 mypy)不应重新分配您的变量。这是最接近Java的.但是,它实际上并不能阻止重新分配final

from typing import Final

a: Final[int] = 1

# Executes fine, but mypy will report an error if you run mypy on this:
a = 2

答案 2

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

下面是使用类属性的替代实现:

请注意,对于想知道常量的读者来说,代码远非易事。请参阅下面的说明。

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(hex(CONST.FOO))  # -> '0xbaadfaceL'

CONST.FOO = 0
##Traceback (most recent call last):
##  File "example1.py", line 22, in <module>
##    CONST.FOO = 0
##  File "example1.py", line 5, in fset
##    raise TypeError
##TypeError

代码说明:

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

以其他一些更老式的方式:

(代码相当棘手,下面有更多解释)

class _Const(object):
    def FOO():
        def fset(self, value):
            raise TypeError
        def fget(self):
            return 0xBAADFACE
        return property(**locals())
    FOO = FOO()  # Define property.

CONST = _Const()

print(hex(CONST.FOO))  # -> '0xbaadfaceL'

CONST.FOO = 0
##Traceback (most recent call last):
##  File "example2.py", line 16, in <module>
##    CONST.FOO = 0
##  File "example2.py", line 6, in fset
##    raise TypeError
##TypeError
  1. 为了定义FOO标识符,firs定义了两个函数(fset,fget - 名称由我选择)。
  2. 然后使用内置函数构造一个可以“设置”或“get”的对象。property
  3. 请注意,该函数的前两个参数被命名为 和 。propertyfsetfget
  4. 使用我们为自己的 getter & setter 选择这些名称的事实,并使用应用于该作用域的所有局部定义的 **(双星号)创建关键字字典,以将参数传递给函数property

推荐