Хороший способ превратить dict в TypedDict?Python

Программы на Python
Anonymous
Хороший способ превратить dict в TypedDict?

Сообщение Anonymous »

Примечание: поскольку этот ответ продолжает получать одобрение - хотя варианты использования TypedDict все еще существуют, я бы сегодня рассмотрел возможность использования вместо него класса данных.

Я хочу иметь хороший (`mypy --strict` и pythonic) способ превратить нетипизированный `dict` (из `json.loads()`) в `TypedDict`. Мой текущий подход выглядит следующим образом:

Код: Выделить всё

class BackupData(TypedDict, total=False):
archive_name: str
archive_size: int
transfer_size: int
transfer_time: float
error: str

def to_backup_data(data: Mapping[str, Any]) -> BackupData:
result = BackupData()
if 'archive_name' in data:
result['archive_name'] = str(data['archive_name'])
if 'archive_size' in data:
result['archive_size'] = int(data['archive_size'])
if 'transfer_size' in data:
result['transfer_size'] = int(data['transfer_size'])
if 'transfer_time' in data:
result['transfer_time'] = int(data['transfer_time'])
if 'error' in data:
result['error'] = str(data['error'])
return result
т.е. у меня есть TypedDict с дополнительными ключами и мне нужен экземпляр TypedDict.
Приведенный выше код избыточен и нефункционален (с точки зрения функционального программирования), поскольку мне приходится писать имена четыре раза, типы дважды, а результат должен быть изменяемым.
К сожалению, TypedDict не может иметь методов, иначе я мог бы написать что-то. нравится

Код: Выделить всё

backup_data = BackupData.from(json.loads({...}))
Есть ли что-то, что мне не хватает в отношении TypeDict? Можно ли это написать красиво и без избыточности?

Вернуться в «Python»