如何解决为什么我需要转换 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”
的结果来修复它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 举报,一经查实,本站将立刻删除。