[英]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.Fruits
、 Key.Cars
或Key.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.