[英]In python, how can I make a dict/typeddict that has a default type and type hints for known keys (additionalProperties implementation)?
[英]How to make a TypedDict with integer keys?
是否可以使用帶有 TypedDict 的 integer 鍵(類似於 dict?)。
嘗試一個簡單的例子:
from typing import TypedDict
class Moves(TypedDict):
0: int=1
1: int=2
拋出: SyntaxError: illegal target for annotation
似乎只支持Mapping[str, int]
但我想確認一下。 Pep 文檔中沒有具體說明。
TypedDict
的意圖在PEP 的摘要中是明確的(添加了重點):
這個 PEP 提出了一個類型構造函數
typing.TypedDict
來支持字典 object 具有一組特定的字符串鍵的用例,每個鍵都有一個特定類型的值。
並且鑒於預期的用例在 class 語法中都是可注釋的,隱式僅適用於由構成有效標識符的字符串(您可以用作屬性或關鍵字參數名稱的東西)鍵入的dict
s,甚至不是一般的字符串。 因此,正如預期的那樣, int
鍵不是一個東西,這只是為了啟用 class 使用類似dict
的語法來訪問“屬性”而不是屬性訪問語法。
雖然替代的向后兼容語法允許與 3.6 之前的 Python 兼容,但允許這樣做(以及允許不是有效的 Python 標識符的字符串),例如:
Moves = TypedDict('Moves', {0: int, 1: int})
您只能使用dict
文字(例如Moves({0: 123, 1: 456})
)構造它,因為像Moves(0=123, 1=456)
這樣的更簡潔的關鍵字語法不起作用。 即使這在技術上在運行時有效(畢竟這只是dict
的底層),驗證您的類型正確性的實際類型檢查器可能不支持它(因為意圖和記錄的使用專門處理構成有效標識符的字符串) .
重點是,不要這樣做。 對於您在此處描述的簡單情況(連續的tuple
integer “鍵”從零開始,其中每個 position 具有獨立的含義,它們可能或可能不會因類型而異:)
Moves = typing.Tuple[int, int] # Could be [int, str] if index 1 should be a string
將以相同的方式用於注釋,並且您在代碼中的實際使用點只是普通的tuple
語法( return 1, 2
)。
如果您真的希望在創建實例時能夠使用名稱Moves
,那么在 3.9+ 上,您可以使用PEP 585來執行(無需導入):
Moves = tuple[int, int]
允許你寫:
return Moves((1, 2))
當你想制作它的“實例”時。 不涉及運行時檢查(它大致相當於在運行時運行tuple((1, 2))
),但 static 類型檢查器應該理解其意圖。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.