TypedDict не может объявить атрибут с именем не

Я пытаюсь объявить тип для спецификации схемы JSON, чтобы я мог проверять типы с передачей схем с помощью jsonschema Пакет Python. Это Dict, поэтому я использую Python 3.8 TypedDict. Вот что у меня есть до сих пор:

from typing import List, Dict, Any, TypedDict, Optional

class JSONSchema(TypedDict):
    """A type for the JSONSchema spec"""
    type: str
    title: Optional[str]
    description: Optional[str]
    properties: Optional[Dict[str, JSONSchema]]
    required: Optional[List[str]]
    additionalProperties: Optional[bool]
    definitions: Optional[Dict[str, JSONSchema]]
    minLength: Optional[int]
    maxLength: Optional[int]
    allOf: Optional[List[JSONSchema]]
    anyOf: Optional[List[JSONSchema]]
    oneOf: Optional[List[JSONSchema]]
    not: Optional[JSONSchema]

Однако я получаю следующую синтаксическую ошибку:

  File "autocoder_ocr/schemas.py", line 39
    not: Optional[JSONSchema]
       ^
SyntaxError: invalid syntax

Это потому, что not является ключевым словом языка. Однако "not" является допустимым ключом dict. Итак, как я могу объявить это в определении типа?

Я использую Python 3.8.2


person Andy Carlson    schedule 22.05.2020    source источник


Ответы (1)


Эй, вы можете использовать этот стиль, он позволит вам использовать не как ключ.

from typing import List, Dict, Any, TypedDict, Optional
JSONSchema = TypedDict(
    "JSONSchema",
    {
        "type": str,
        "title": Optional[str],
        "description": Optional[str],
        "properties": Optional[Dict[str, JSONSchema]],
        "required": Optional[List[str]],
        "additionalProperties": Optional[bool],
        "definitions": Optional[Dict[str, JSONSchema]],
        "minLength": Optional[int],
        "maxLength": Optional[int],
        "allOf": Optional[List[JSONSchema]],
        "anyOf": Optional[List[JSONSchema]],
        "oneOf": Optional[List[JSONSchema]],
        "not": Optional[JSONSchema],
    },
)

Вторая ошибка в вашем коде заключается в том, что JSONSchema не определена в теле класса или, таким образом, в правой части задания. В конце концов вы сможете написать что-то вроде Optional["JSONSchema"], но это не реализовано.

Рекурсивные или циклические определения типов в настоящее время не поддерживаются. Вот проблема с github: https://github.com/python/mypy/issues/731 , возможно, вы сможете найти обходной путь где-то там.

person Mark    schedule 22.05.2020