【问题标题】:What exactly constitutes a constant in Python?Python 中的常量究竟是什么?
【发布时间】:2018-02-10 18:27:05
【问题描述】:

PEP 8 prescribes那个

常量通常是在模块级别定义的,并写在所有 用下划线分隔单词的大写字母。例子包括 MAX_OVERFLOWTOTAL

我知道这只是一个命名约定,但我很想知道是否有官方或广泛接受的定义来说明什么是常量和半私有变量。

这仅限于您可能称之为mathematical constants 的内容吗? (即float、int、complex)

或者它会包括在模块级别定义的 datetime.date 对象或字符串之类的东西吗?带有混合类型键/值的字典怎么样?如果答案是否定的,是否应该将这些类型的对象定义为带有_leading_underscore 的(准)私有变量?

【问题讨论】:

  • Python 实际上没有真正的常量。命名约定只是为了便于阅读。
  • 本质上,由于 Python 没有实际的“常量”,因此将一些模块级对象(不限于数学常量)大写只是向那些阅读您的代码的人发出信号“不要搞砸这个,这应该“不改变”
  • 就像在所有编程语言中一样,常数只是不变的东西。
  • 这里是一个关于常量使用的问题的链接。 the-benefits-of-constants。在其他语言中它有一个好处,但在 python 中它只是一种说“不要改变这个”的方式
  • @BradSolomon:嗯,常量应该是常量。 “私有”和“常量”是完全独立的概念,您可以将 _FOO 用于私有常量。

标签: python python-3.x pep8


【解决方案1】:

嗯,PEP 8 编码约定主要是 Python 标准库 编写的:

本文档给出了 Python 代码的编码约定,这些代码构成了主要 Python 发行版中的标准库。

通过搜索 Python 3.5 标准库中的一些模块,以及通常的字符串和数字,您会发现类似

UUIDs,uuid.py:

NAMESPACE_URL = UUID('6ba7b811-9dad-11d1-80b4-00c04fd430c8')

正则表达式,smtplib.py

OLDSTYLE_AUTH = re.compile(r"auth=(.*)", re.I)

字典,plistlib.py:

_BINARY_FORMAT = {1: 'B', 2: 'H', 4: 'L', 8: 'Q'}

frozensets, asyncore.py:

_DISCONNECTED = frozenset({ECONNRESET, ENOTCONN, ESHUTDOWN, ECONNABORTED, EPIPE, ...

在calendar.py中的datetime.date

_EPOCH_ORD = datetime.date(EPOCH, 1, 1).toordinal()

因此基本上任何应该在整个执行期间保持不变的东西,即使它是可变类型(plistlib.py 中的字典)。

【讨论】:

    【解决方案2】:

    在大多数情况下,在 python 中,PEP8 常量命名约定只是为了帮助任何正在阅读代码的程序员知道不要更改特定的“常量”在其他语言(如 C)中,它实际上可以减少时间执行代码。

    The Benefits of Constants 上查看此帖子。

    常量只是一个永远不会改变的值。

    在 OOP 中,声明私有或公共常量很有用,但对于 python,“常量”和常规变量没有功能分离。

    在其他支持真正常量的编程语言中,如果您将一个值声明为常量,那么即使您稍后尝试重新分配该值,该值也不会改变。然而,在 Python 中,没有真正的常量,因此我们使用命名约定来帮助我们记住不要更改该值。

    【讨论】:

      猜你喜欢
      • 2017-07-13
      • 2014-06-18
      • 2019-08-12
      • 2014-10-28
      • 2012-08-27
      • 2010-11-12
      • 2011-03-18
      • 2011-01-22
      相关资源
      最近更新 更多