我想创建一个表示此字典的类型。
{
"13fc71ee-e676-4e5d-a561-a20af5bcbaaf": "123",
"8d742ecf-6ae9-4408-a5a0-b1110f9b5365": "fdsafdsa",
"literal": {
"any": "dict",
},
}这是我能想到的最接近的类型:
Dict[UUID | Literal["literal"], str | dict]以上类型签名的主要问题是允许使用以下字典:
{
"8d742ecf-6ae9-4408-a5a0-b1110f9b5365": {
"dictionary": 321,
},
"literal": "some string",
}是否有一种方法可以对字典进行注释,其类型既可以是字符串值的UUID键,也可以是dict值的字符串文本?
发布于 2022-03-12 02:31:20
您所要求的可能需要运行时知识,因此不能(以一种有用的方式)作为一种类型进行编码。也许有一种方法可以为一些类似的类型创建一个可以使用静态类型检查器的自定义类型,但我认为它会很复杂。因此,我提出了一些备选方案:
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",
},
}数据:
@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"]。
运行时检查
如果所有其他操作都失败了,并且确实需要验证类型系统无法处理的约束,则可以通过isinstance或beartype等库执行各种运行时检查。
https://stackoverflow.com/questions/71445755
复制相似问题