制作一个字符串联合,用作可能的字典键
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
。它说:
"fruits is not defined"
我想让 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}")
我有一些 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
。它说:
"fruits is not defined"
我想让 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}")