gpt4 book ai didi

python - 带有键/值类型对的类型提示字典

转载 作者:行者123 更新时间:2023-12-05 06:21:06 25 4
gpt4 key购买 nike

是否可以使用 Python 类型提示将字典的键和值的类型指定为成对?

例如:

  • 如果键是int,值应该是str
  • 如果键是str,值应该是int

如果我写:

Dict[Union[int, str], Union[int, str]]

它允许 str -> strint -> int,这是不允许的。

还有:

Union[Dict[int, str], Dict[str, int]]

字典可以或者 Dict[int, str]Dict[str, int],但不能同时是两者时间...

我还查看了 TypedDict,但它需要明确提供所有键。

最佳答案

如果您的应用程序可以接受使用 typing.cast,那么这可以通过创建一个 Dict 的子类来完成,该子类覆盖了 __setitem____getitem__,将您的字典转换为该类型。从那时起,类型检查器将推断出正确的 KeyType: ValueType 对。

这种方法的注意事项是您不能使用它来类型检查正确的 dict 构造,因为这发生在转换之前。此外,您需要为 update__iter__ 和可能的其他 dict 方法添加更多覆盖,以对 __setitem__/之外的内容进行类型检查__getitem__ 字典访问。

例子:

from typing import Dict, overload, cast


class KVTypePairedDict(Dict):
@overload
def __getitem__(self, key: str) -> int: ...
@overload
def __getitem__(self, key: int) -> str: ...
def __getitem__(self, key): ...

@overload
def __setitem__(self, key: str, value: int) -> None: ...
@overload
def __setitem__(self, key: int, value: str) -> None: ...
def __setitem__(self, key, value): ...


test: KVTypePairedDict = cast(KVTypePairedDict, {"foo": 0, 1: "bar"})

# str keys
a: int = test["foo"]
test["foo"] = 0
c: str = test["foo"] # <-- mypy and PyCharm flag this
test["foo"] = "bar" # <-- mypy and PyCharm flag this

# int keys
d: str = test[1]
test[1] = "bar"
b: int = test[0] # <-- mypy and PyCharm flag this
test[1] = 0 # <-- mypy and PyCharm flag this

关于python - 带有键/值类型对的类型提示字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60114492/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com