Словарь с Literal ключами

Плюс в описанном выше словаре ключом является строка, получается — любая строка? Но нет, в реальности не любая, а только одна из двух строк — longitude или latitude. Это можно отразить в type hinting с помощью Literal:

from typing import Literal

def get_gps_coordinates() -> dict[Literal["longitude"] | Literal["latitude"], float]:
    return {"longitude": 10, "latitude": 20}

print(
    get_gps_coordinates()["longitude"]
)

print(
    get_gps_coordinates()["longitudeRRR"]  # Тут IDE покажет ошибку!
)

Literal позволяет указать не просто какой-то тип вроде str, а позволяет указать конкретное значение этого типа. В данном случае у нас ключом может быть либо строка со значением "longitude", либо строка со значением "latitude".

Вот эта вертикальная черта обозначает ИЛИ, то есть или тип слева от черты, или тип справа от черты. Это синтаксис Python 3.10, в предыдущих версиях Python нужно было импортировать из typing специальный тип Union, который делал то же самое. Сейчас можно просто пользоваться вертикальной чертой для того, чтобы задать несколько возможных типов для переменной.

В случае именно Literal для указания нескольких возможных значений можно обойтись без объединения нескольких типов через вертикальную черту и задать тип следующим образом:

def get_gps_coordinates() -> dict[Literal["longitude", "latitude"], float]:
    return {"longitude": 10, "latitude": 20}

А если тип переменной представляет из себя, например, число или строку, тогда эти типы объединяются через вертикальную черту:

age: int | str

Кстати, literally — по-русски означает «буквально». То есть, когда нам надо буквально задать конкретные значения в типе, мы можем это сделать при помощи типа Literal.

В целом в таком формате использовать словарь здесь можно, но мне больше нравится вариант с именованным кортежем из этих двух вариантов.