首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Python中创建常量?

如何在Python中创建常量?
EN

Stack Overflow用户
提问于 2010-04-21 20:20:19
回答 43查看 1.2M关注 0票数 1.2K

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

代码语言:javascript
运行
复制
public static final String CONST_NAME = "Name";

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

EN

回答 43

Stack Overflow用户

回答已采纳

发布于 2010-04-21 20:21:55

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

如果您在某个类中,则等效项为:

代码语言:javascript
运行
复制
class Foo(object):
    CONST_NAME = "Name"

如果不是,它只是

代码语言:javascript
运行
复制
CONST_NAME = "Name"

但是您可能想看一下Alex Martelli编写的代码片段Constants in Python

从Python3.8开始,有一个typing.Final变量注释,它会告诉静态类型检查器(比如mypy)你的变量不应该被重新赋值。这是与Java的final最接近的等价物。但是,it 实际上并不会阻止重新分配

代码语言:javascript
运行
复制
from typing import Final

a: Final = 1

# Executes fine, but mypy will report an error if you run mypy on this:
a = 2
票数 1.2K
EN

Stack Overflow用户

发布于 2010-04-22 11:39:39

在其他语言中没有const关键字,但是可以创建一个属性,即有一个"getter function"来读取数据,但是没有"setter function"来重写数据。这实际上保护了标识符不会被更改。

下面是一个使用class属性的替代实现:

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

代码语言:javascript
运行
复制
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

代码说明:

expression.

  • The setter定义一个接受表达式的函数constant,并使用它来构造一个“TypeError”-一个只返回expression.

  • The setter函数的值的函数引发一个setter,因此它是我们刚刚创建的作为装饰的constantTypeError,以快速定义只读属性。

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

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

代码语言:javascript
运行
复制
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修饰符似乎已被弃用。

使用内置的property函数来构造一个可以是“”或“

  1. ”的对象。
  2. 注意property函数的前两个参数分别命名为fsetfget
  3. 利用我们为自己的getter和setter选择了这些名称的事实,并使用应用于该作用域的所有本地定义的** (双星号)创建了一个关键字字典,以将参数传递给property函数
票数 404
EN

Stack Overflow用户

发布于 2010-04-21 21:06:32

在Python中,人们使用命名约定,例如私有方法使用__method,保护方法使用_method,而不是使用语言强制执行某些东西。

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

代码语言:javascript
运行
复制
MY_CONSTANT = "one"

如果您希望这个常量永远不会改变,您可以挂钩到属性访问并执行一些技巧,但更简单的方法是声明一个函数

代码语言:javascript
运行
复制
def MY_CONSTANT():
    return "one"

唯一的问题是你必须做MY_CONSTANT(),但是在python中MY_CONSTANT = "one" (通常)是正确的方式。

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

代码语言:javascript
运行
复制
>>> 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
票数 133
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2682745

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档