[Python >= 3.8] 定数

# typing --- 型ヒントのサポート | Python Doc
https://docs.python.org/ja/3.12/library/typing.html

from typing import Final, NamedTuple, TypedDict

INIT_PATH: Final[str] = "./users/"
MAX_ROW: Final[int] = 100_000_000
PLACE_NAMES: Final[tuple[str, str]] = ('東京', '大阪')

class TypedPerson(TypedDict):
    r"""aaa"""
    name: str  # Finalは指定できない
    age: int
    no: int

PERSON_001: Final[TypedPerson] = {
    'name': "Yamada Taro",
    'age': 20,
    'no': 123
}

class TypedBranch(NamedTuple):
    r"""aaa"""
    name: str
    place: str
    no: int

BRANCH: TypedBranch = TypedBranch(
    "Akihabara",
    "東京",
    100,
)

print(f"{INIT_PATH=}")          # ./users/
print(f"{MAX_ROW=}")            # 100000000
print(f"{PLACE_NAMES=}")        # 東京 大阪
print(f"{PERSON_001['name']=}") # Yamada Taro
print(f"{BRANCH.name=}")        # Akihabara

# 型チェックでreportGeneralTypeIssuesになるが代入はできる
INIT_PATH = "aaaa"
MAX_ROW = 9_999
PLACE_NAMES = ('名古屋', '神戸')

# 型チェックでreportGeneralTypeIssuesにならず代入ができる
# TypedDictは型チェックにも引っかからないので定数としては使えない
PERSON_001['name'] = "Sato Jiro"

print(f"{INIT_PATH=}")          # aaaa
print(f"{MAX_ROW=:,}")          # 9,999
print(f"{PLACE_NAMES=}")        # 名古屋 神戸
print(f"{PERSON_001['name']=}") # Sato Jiro

# 型チェックでreportGeneralTypeIssuesになり
# 実行時にAttributeError: can't set attributeにもなり代入できない
BRANCH.name = 'Ueno'

print(f"{BRANCH.name=}")
※NamedTupleはあくまでtupleなので同じ値が同じ並びにあるもの同士は同じものと判断されるので丸ごとの比較には使用できない