首页 > 解决方案 > TypedDict 无法声明名为“not”的属性

问题描述

我正在尝试为JSON Schema 规范jsonschema声明一个类型,以便我可以通过使用Python 包传递模式来验证类型。它是一个字典,所以我使用的是 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

标签: pythonpython-typing

解决方案


嘿,你可以使用这种风格,它会让你不作为钥匙使用。

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,您可能可以在其中的某个地方找到工作。


推荐阅读