首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据字典的键表示字典的不同类型

根据字典的键表示字典的不同类型
EN

Stack Overflow用户
提问于 2022-03-11 23:41:19
回答 1查看 125关注 0票数 2

我想创建一个表示此字典的类型。

代码语言:javascript
复制
{
   "13fc71ee-e676-4e5d-a561-a20af5bcbaaf": "123",
   "8d742ecf-6ae9-4408-a5a0-b1110f9b5365": "fdsafdsa",
   "literal": {
       "any": "dict",
   },
}

这是我能想到的最接近的类型:

代码语言:javascript
复制
Dict[UUID | Literal["literal"], str | dict]

以上类型签名的主要问题是允许使用以下字典:

代码语言:javascript
复制
{
   "8d742ecf-6ae9-4408-a5a0-b1110f9b5365": {
       "dictionary": 321,
   },
   "literal": "some string",
}

是否有一种方法可以对字典进行注释,其类型既可以是字符串值的UUID键,也可以是dict值的字符串文本?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-12 02:31:20

您所要求的可能需要运行时知识,因此不能(以一种有用的方式)作为一种类型进行编码。也许有一种方法可以为一些类似的类型创建一个可以使用静态类型检查器的自定义类型,但我认为它会很复杂。因此,我提出了一些备选方案:

typing.TypedDict

代码语言:javascript
复制
class ItemType(TypedDict):
    uuids: dict[str, str]
    literal: dict[str, Any]

d: ItemType = {
    "uuids": {
        "13fc71ee-e676-4e5d-a561-a20af5bcbaaf": "123",
        "8d742ecf-6ae9-4408-a5a0-b1110f9b5365": "fdsafdsa",
    },
    "literal": {
        "any": "dict",
    },
}

数据:

代码语言:javascript
复制
@dataclass
class Item:
    uuids: dict[str, str]
    literal: dict[str, Any]

d = Item(**{
    "uuids": {
        "13fc71ee-e676-4e5d-a561-a20af5bcbaaf": "123",
        "8d742ecf-6ae9-4408-a5a0-b1110f9b5365": "fdsafdsa",
    },
    "literal": {
        "any": "dict",
    },
})

或者,可以考虑重写__getitem__以允许类似字典的访问d["literal"]

运行时检查

如果所有其他操作都失败了,并且确实需要验证类型系统无法处理的约束,则可以通过isinstancebeartype等库执行各种运行时检查。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71445755

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档