我想創建一個代表這個字典的型別
{
"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 值的字串文字的型別來注釋字典?
uj5u.com熱心網友回復:
您所要求的可能需要運行時知識,因此不能(以有用的方式)編碼為一種型別。也許有一種方法可以創建一個自定義型別,該型別可以與靜態型別檢查器一起用于某些類似型別,但我想這會很復雜。因此,我提出了一些替代方案:
typing.TypedDict:
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://www.uj5u.com/shujuku/444692.html
