Python – What Exactly Constitutes a Constant in Python?

pep8pythonpython-3.x

PEP 8 prescribes that

Constants are usually defined on a module level and written in all
capital letters with underscores separating words. Examples include
MAX_OVERFLOW and TOTAL.

I understand that this is a naming convention only, but I'm curious to know if there is an official or widely-accepted definition of what actually constitutes a constant versus a semi-private variable.

Is this limited to what you might call mathematical constants? (Namely float, int, complex)

Or would it include things like datetime.date objects or strings that are defined at the module level? How about a dictionary with keys/values of mixed types? If the answer is no, should these types of objects be defined like (quasi-) private variables with _leading_underscore?

Best Answer

Well, the PEP 8 coding conventions were primarily written for the Python standard library:

This document gives coding conventions for the Python code comprising the standard library in the main Python distribution.

Grepping through some of the modules in the Python 3.5 standard library, alongside with the usual strings and numbers, one finds things like

UUIDs, uuid.py:

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

regular expressions, smtplib.py

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

dictionaries, plistlib.py:

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

frozensets, asyncore.py:

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

and a datetime.date in calendar.py

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

thus basically anything that is supposed to remain constant for the entire duration of the execution, even if it were a mutable type (the dictionary in plistlib.py).

Related Question