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

为什么我需要转换 copy.deepcopy 的结果?

如何解决为什么我需要转换 copy.deepcopy 的结果?

这是我为玩具类重载 __deepcopy__ 的尝试

import copy
from typing import Dict

class Foo:
    pass


class Bar:
    def __init__(self,foo: Foo):
        self._foo = foo

    def __deepcopy__(self,memo: Dict[int,object]) -> Bar:
        return Bar(copy.deepcopy(self._foo,memo))

然而,mypy 抱怨

错误:“Bar”的参数 1 具有不兼容的类型“object”;预期的“Foo”

我可以通过转换 copy.deepcopy

的结果来修复它
from typing import cast

    ...
    def __deepcopy__(self,object]) -> Bar:
        return Bar(cast(Foo,copy.deepcopy(self._foo,memo)))

但这感觉没有必要。我这样做对吗?

编辑:我刚刚挖掘了 typeshed repo,发现他们确实输入了

_T = TypeVar("_T")

def deepcopy(
    x: _T,memo: Optional[Dict[int,Any]] = ...,_nil: Any = ...
) -> _T: ...

我认为应该可以防止需要 cast

解决方法

deepcopy 的类型签名是对的

def deepcopy(x: _T,memo: Optional[Dict[int,Any]] = ...,_nil: Any = ...) -> _T: ...

将避免强制转换结果。

但是,这在 5 天前已在 https://github.com/python/typeshed/pull/4828 中修复。

因此,mypy 没有使用该类型定义,而是使用签名:

def deepcopy(x: _T,_T]] = ...,_nil: Any = ...) -> _T: ...

您有 3 个选择:

  • 在此期间继续使用演员表
  • 克隆最新版本的 typeshed 并使用配置选项 custom_typeshed_dir
  • memo 的类型更改为 Dict[int,Foo]

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