簡體   English   中英

如何使用 integer 鍵制作 TypedDict?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM