LINUX.ORG.RU

Как правильно объявить тип данных list(dict(k1: str, k2: int))?

 ,


0

1

Есть функция, которая принимает аргумент в виде списка словарей. Что-то на подобие:

def aaa(some: list(dict(k1: str, k2: int))):
    pass

Смотрю https://docs.python.org/3/library/typing.html#typing.NewType

Но не могу понять, как сделать list(TypedDict)

Ответ на: комментарий от Aswed

#!/usr/local/bin/python3.9
# -*- coding: UTF-8 -*-


from typing import (
    NewType,
    List,
    TypedDict,
)

class Point2D(TypedDict):
    x: str
    y: int
    label: str


def aaa(x: List[Point2D]):
    print("zzzz")
    print(x)

zzz = {'x': 1, 'y': 2.2, 'label': 'good'}
try:
    aaa(zzz)    
except TypeError as e:
    print(e)

$./test.py ``` {‘x’: 1, ‘y’: 2.2, ‘label’: ‘good’}


Не получается
serg002 ()
Последнее исправление: serg002 (всего исправлений: 3)
Ответ на: комментарий от serg002

Используй mypy, какую-нибудь IDE или если очень нужны проверки типов(и тормоза) в рантайме, что-то вроде https://pypi.org/project/enforce-typing/

При получении данных из внешних источников надо в любом случае городить какой-нибудь сериализатор.

pawnhearts ★★★★★ ()
Ответ на: комментарий от serg002

Аннотация типов нужна только для читабельности и метапрограммирования. Хочешь проверку типов по аннтотациям - юзай ide, которые пытаются выводить тип переменных в коде, или mypy, который производит некий аналог проверки типов на этапе компиляции. Если же тебе прям в рантайме непременно надо типы проверять/приводить, то тебе в pydantic

Aswed ★★★★★ ()
Ответ на: комментарий от in_dance

Не следил. Могу только предположить, что сразу не додумались. Вынесение в любом случае было логично, во-первых тупо по аналогии с модулем types, во-вторых там куча всяких типов (сиквенс, юнион, генератор и прочее), которые иначе бы не было возможности обозначить, и куча типов, собранных со всей стандартной библиотеки, которую в противном случае пришлось бы глобально перелопатить.

WitcherGeralt ★★ ()