首页 > 编程问答 >Mypy:属性设置器分配中的类型不兼容

Mypy:属性设置器分配中的类型不兼容

时间:2024-07-30 14:20:01浏览次数:6  
标签:python python-typing mypy

我想与 mypy 一起使用 property setter 属性 getter 和 setter 的类型不同:

from typing import List, Iterable

class Foo:
    @property
    def x(self) -> List[int]:
        ...

    @x.setter
    def x(self, new_x: Iterable[int]):
        ...

foo = Foo()
foo.x = (1, 2, 3) # error: Incompatible types in assignment (expression has type "Tuple[int, int, int]", variable has type "List[int]")

如何处理此错误?


在将 tuple 分配给预期 List[int] 的属性时收到 Mypy 错误,即使 setter 使用 Iterable[int] 也是如此,因为它比 List[int] 更通用。问题是 Mypy 不会自动将 tuple 转换为 List[int]

可以通过以下几种方法解决此错误:

  1. 在设置器中明确转换类型:
from typing import List, Iterable

class Foo:
    @property
    def x(self) -> List[int]:
        ...

    @x.setter
    def x(self, new_x: Iterable[int]):
        self._x = list(new_x)  # 将 new_x 转换为 List[int]

foo = Foo()
foo.x = (1, 2, 3)  # 现在可以了

此解决方案将传入的 Iterable[int] 转换为 List[int] ,使其与属性的预期类型兼容。

  1. 使属性类型更通用:
from typing import Iterable

class Foo:
    @property
    def x(self) -> Iterable[int]:
        ...

    @x.setter
    def x(self, new_x: Iterable[int]):
        self._x = new_x

foo = Foo()
foo.x = (1, 2, 3)  # 现在可以了

在此解决方案中,将属性类型更改为 Iterable[int] ,使其与 setter 中使用的类型相匹配。这允许分配任何类型的可迭代对象,包括元组。

  1. 在分配时显式转换类型:
from typing import List, Iterable

class Foo:
    @property
    def x(self) -> List[int]:
        ...

    @x.setter
    def x(self, new_x: Iterable[int]):
        ...

foo = Foo()
foo.x = list((1, 2, 3))  # 将元组转换为列表

此解决方案将分配给属性的值显式转换为 List[int]

最佳方法取决于的具体需求和代码库的整体设计。如果需要该属性始终是列表,则第一个解决方案是最佳选择。如果可以使用更通用的可迭代对象类型,则第二个解决方案是更好的选择。第三个解决方案是最不干扰的,但它确实需要在每次分配值时进行显式转换。

标签:python,python-typing,mypy
From: 59964767

相关文章

  • 如何测试 python 类型协议是另一个协议的子类?
    该问题的明显解决方案是使用issubclass,但这会引发TypeError(使用Python3.6.7),例如>>>fromtyping_extensionsimportProtocol>>>classProtoSubclass(Protocol):...pass...>>>issubclass(ProtoSubclass,Protocol)Traceback(mos......
  • Python:指定与继承一起使用的类方法的返回类型
    我一直在尝试了解如何在Python中指定类方法的返回类型,以便即使对于子类也能正确解释它(例如在我的Sphinx文档中)。假设我有:classParent:@classmethoddefa_class_method(cls)->'Parent':returncls()classChild(Parent):pass什么如......
  • python使用SMTP功能发送邮件
    网页格式发送for_email.html<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>Title</title><style>h1{color:brown;}p{margin:5px;color:purple......
  • 为什么参数类型“Dict[str, Union[str, int]]”不接受类型“Dict[str, str]”的值(mypy
    我有一个传递给模板的变量字典的类型:VariablesDict=Dict[str,Union[int,float,str,None]]基本上,任何字典,其中键是字符串,值是字符串、数字或None。我在几个与模板相关的函数中使用这种类型。以这个示例函数为例:defrender_template(name:str,variables:Vari......
  • python之代码简化式(列表、字典生成式,递归函数,迭代器(iter)和生成器(yield)、匿名函数(
    文章目录前言1、列表、字典生成式2、递归函数2.1python中代码的递归深度(扩展)3、拓展:迭代器和生成器3.1迭代器(iter)3.2生成器(yield)4、匿名函数(lambda)4.1map函数4.2reduce函数(较少使用)4.3filter函数前言本文主要讲解一些简化代码格式的一些方法,方便大家更好的......
  • Python:在 Protocol 和 TypedDict 之间共享类型注释
    举这个简单的例子:from__future__importannotationsimporttypingastclassMyType:def__init__(self,s:str,i:int)->None:self.s=sself.i=iclassMyProto(t.Protocol):s:stri:intclassMyDict(t.TypedDict):......
  • PIL 和 python 静态类型
    我有一个函数参数,它可以接受图像的多种类型:defsomefunc(img:Union[np.array,Image,Path,str]):PILImage在这种情况下抛出以下异常:TypeError:Union[arg,...]:eachargmustbeatype.Got<module'PIL.Image'from...进一步检查图像对象后这才有......
  • 学会用Python爬取小说网站,想看什么就爬什么,广告也不用看了~
    今天以爬取笔趣阁小说网站为例,练习Python爬虫技术。通过这个爬虫,可以完成批量爬取一本小说的所有章节,并将所有章节内容按顺序保存到一个txt文档内,下面我们就开始吧。首先,百度搜索“笔趣阁”,发现有很多网站都叫笔趣阁。我们可以随便挑选一个网站尝试,本文我以‘https://......
  • 计算机毕业设计django+vue《Python数据分析》的教学系统【开题+论文+程序】
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景在当今数字化时代,数据分析已成为各行各业不可或缺的技能之一,而Python作为数据分析领域的首选语言,其重要性日益凸显。然而,传统的教学模式在......
  • 如何将多个变量分配给 python 函数中的单个参数?
    我正在尝试编写一个程序,如果可能的话,它需要一个三项式并对其进行因式分解。每当用户输入A、B和C时,三项式应该通过Factor(product,summation)函数获取,但我似乎无法弄清楚如何将A和C分配给乘积arg,将B分配给我尝试在函数外部声明不同的变量,product=(a*c)和summati......