【问题标题】:TypedDict cannot declare attribute named "not" [duplicate]TypedDict 无法声明名为“not”的属性 [重复]
【发布时间】:2020-05-22 17:12:24
【问题描述】:

我正在尝试为JSON Schema spec 声明一个类型,以便我可以通过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" 一个有效的字典键。那么如何在类型定义中声明呢?

我正在使用 Python 3.8.2

【问题讨论】:

    标签: python python-typing


    【解决方案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,您也许可以在其中的某个地方找到工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-06
      • 2020-12-16
      • 1970-01-01
      • 2013-09-17
      • 2023-03-05
      • 2012-07-12
      • 1970-01-01
      相关资源
      最近更新 更多