如何在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函数”来读取数据的属性,但不能使用“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

代码说明:

  • 定义一个接受表达式的函数constant ,并使用它来构造一个“getter” - 一个仅返回表达式值的函数。
  • setter函数引发TypeError,因此它是只读的
  • 使用我们刚刚创建的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装饰器似乎已被弃用。

  • 为了定义标识符FOO,firs定义了两个函数(fset,fget - 这些名称由我选择)。
  • 然后使用内置的property函数来构建一个可以“设置”或“获取”的对象。
  • 注意property函数的前两个参数名为fsetfget
  • 使用我们为自己的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
    
    链接地址: http://www.djcxy.com/p/6991.html

    上一篇: How do I create a constant in Python?

    下一篇: Use of isinstance() can overwrite type