【问题标题】:Python Type OverloadsPython 类型重载
【发布时间】:2021-11-05 01:12:54
【问题描述】:

我一直在用一个小时的最佳时间来试图弄清楚为什么 Pylance 会指示我没有看到过载整体存在错误。

这是我的代码

PR = TypeVar('PR', bound=str)
VA = TypeVar('VA')

class NS(Mapping[PR, VA]):
    @overload
    def __getitem__(self, property: PR) -> VA:
        ...
    @overload
    def __getitem__(self, property: Sequence[PR]) -> List[VA]:
        ...
    def __getitem__(self, property: PR|Sequence[PR]) -> VA|List[VA]:
        # function implementation

【问题讨论】:

  • 万一我做错了,应该有人帮我弄清楚。我想要在提供一系列属性PR 时返回值列表VA。如果提供了单个属性,则返回单个值。
  • 嗯最后一个 getitem 没有重载装饰器?除了第一个和第二个的签名是第三个的子集
  • @Copperfield 最后一个getitem是函数实现。
  • 我试图删除函数实现上的注释,我得到一个新错误“参数'属性'的类型​​是未知的”

标签: python overloading python-typing


【解决方案1】:

问题在于,当将多个值传递给__getitem__mapping['a','b','c'] 时,它们以元组的形式提供。使用Sequence 太通用了。我现在的代码

    def __getitem__(self, property: PR) -> VA:
        ...
    @overload
    def __getitem__(self, property: Tuple[PR, ...]) -> List[VA]:
        ...
    def __getitem__(self, property: PR|Tuple[PR, ...]) -> VA|List[VA]:
       # function's implementation

【讨论】:

  • 这没有意义。
  • 对 pylance 有好处
  • 这可能是因为str 也是Sequence[str]。我们真的需要NonStrSequence...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-25
  • 1970-01-01
  • 1970-01-01
  • 2017-06-01
相关资源
最近更新 更多