微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

混合类型映射的更强类型注释

如何解决混合类型映射的更强类型注释

假设我有一个映射,在一个字典中映射 string -> int 和 int -> string。有没有办法以严格的方式用类型注释来表达它?目前我可以做 Dict[Union[str,int],Union[str,int]],但这允许 str -> str 和 int -> int,我实际上并不想要。

一个人可能会尝试 Union[Dict[str,Dict[str,int]],但对于它出现的范围,只有其中一个是正确的。

解决方法

这可能是一个解决方案。如果需要,可以重新定义其他方法。 您也可以执行 d=cast(mydict,existing_dict)

from typing import overload


class mydict(dict):

    @overload
    def __getitem__(self,k: int) -> str: ...

    @overload
    def __getitem__(self,k: str) -> int: ...

    def __getitem__(self,k):
        return super(mydict,self).__getitem__(k)

    @overload
    def __setitem__(self,k: int,v: str) -> None: ...

    @overload
    def __setitem__(self,k: str,v: int) -> None: ...

    def __setitem__(self,k,v):
        super(mydict,self).__setitem__(k,v)


m = mydict()
m['a'] = 1
m[1] = 'a'
x1: str = m[1]
x2: int = m['a']
m['a'] = 1
m[1] = 'a'
x3: int = m[1]  # mypy error
x4: str = m['a']  # mypy error
m[2] = 2  # mypy error
m['b'] = 'b'  # mypy error

@MisterMiyagi 如何建议,协议也可以工作:

from typing import overload,Protocol
class mydictprotocol(Protocol):

    @overload
    def __getitem__(self,k: str) -> int: ...

    @overload
    def __setitem__(self,v: int) -> None: ...

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。