簡體   English   中英

將字符串聯合用作可能的字典鍵

[英]Make a Union of strings to be used as possible dictionary keys

我有一些 Python 3.7 代碼,我正在嘗試向其中添加類型。 我要添加的類型之一實際上是幾個可能字符串的Union

from typing import Union, Optional, Dict

PossibleKey = Union["fruits", "cars", "vegetables"]
PossibleType = Dict[PossibleKey, str]

def some_function(target: Optional[PossibleType] = None):
  if target:
    all_fruits = target["fruits"]
    print(f"I have {all_fruits}")

這里的問題是 Pyright 抱怨PossibleKey密鑰。 它說:

“水果沒有定義”

我想讓 Pyright/Pylance 工作。

我已經從另一個 SO 答案檢查了from enum import Enum模塊,但是如果我嘗試這樣做,我最終會遇到更多問題,因為我實際上是在處理Dict[str, Any]而不是Enum

表示我的類型的正確 Pythonic 方式是什么?

"fruits"不是類型(提示),但Literal["fruits"]是。

from typing import Union, Literal

PossibleKey = Union[Literal["fruits"], Literal["cars"], Literal["vegetables"]]

或者更短的版本,

PossibleKey = Literal["fruits", "cars", "vegetables"]

或者,正如您所提到的,定義一個由三個值填充的Enum

from enum import Enum


class Key(Enum):
    Fruits = "fruits"
    Cars = "cars"
    Vegetables = "vegetables"


def some_function(target: Optional[PossibleType] = None):
    if target:
        all_fruits = target[Key.Fruits]
        print(f"I have {all_fruits}")

(然而,僅僅因為target不是None並不一定意味着它實際上"fruits"作為鍵,只是沒有Key.FruitsKey.CarsKey.Vegetables以外的鍵。)

如果您將PossibleKey定義為Enum ,則Pyright錯誤消失,如下所示。 這僅需要對原始代碼進行一行更改。 如果使用 Enum 存在一些問題,請詳細說明。

from typing import Union, Optional, Dict
from enum import Enum

PossibleKey = Enum("PossibleKey", ["fruits", "cars", "vegetables"])
PossibleType = Dict[PossibleKey, str]

def some_function(target: Optional[PossibleType] = None):
  if target:
    all_fruits = target["fruits"]
    print(f"I have {all_fruits}")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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