首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何将元组用作attr.ib的转换器,而不会扰乱mypy?

在Python中,attr.ibattrs库中的一个装饰器,用于自动创建属性并添加额外的功能,如类型检查和初始化验证。mypy是一个静态类型检查器,用于在运行代码之前检测类型错误。

如果你想将元组用作attr.ib的转换器,同时确保mypy不会报错,你可以使用自定义的转换函数,并在该函数上使用typing.cast来明确告诉mypy转换后的类型。

以下是一个示例:

代码语言:txt
复制
import attr
from typing import Tuple, cast

def tuple_to_something(value: Tuple[str, int]) -> 'Something':
    # 这里进行你的转换逻辑
    return Something(value[0], value[1])

@attr.s(auto_attribs=True)
class Something:
    name: str
    value: int

# 使用自定义转换器
@attr.s(auto_attribs=True)
class MyClass:
    my_attr: Something = attr.ib(converter=tuple_to_something)

# 示例用法
obj = MyClass(('example', 123))
print(obj.my_attr.name)  # 输出: example
print(obj.my_attr.value)  # 输出: 123

# 确保mypy不会报错
reveal_type(obj.my_attr)  # 应该显示Something类型

在这个例子中,tuple_to_something函数将一个元组转换为一个Something实例。我们使用typing.cast来明确告诉mypy这个转换函数返回的是Something类型。

解释

  1. 自定义转换器tuple_to_something函数负责将元组转换为Something实例。
  2. 类型注解:在tuple_to_something函数的返回类型注解中,我们使用字符串'Something'来表示类型,这样可以避免循环导入问题。
  3. 使用attr.ib:在MyClass中,我们使用attr.ib并指定converter=tuple_to_something来应用自定义转换器。
  4. 类型检查:通过reveal_type函数,我们可以验证mypy是否正确识别了my_attr的类型。

参考链接

这种方法确保了类型安全,并且不会干扰mypy的类型检查。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

流畅 Python 第二版(GPT 重译)(四)

首先我们添加一个使用第三个参数测试。不要忘记为测试函数添加返回类型提示,否则 Mypy不会检查它。...元组类型 有三种注释元组类型方法: 元组作为记录 具有命名字段元组作为记录 元组作为不可变序列 元组作为记录 如果将 tuple 用作记录,则使用内置 tuple 并在 [] 中声明字段类型...要注释用作不可变列表未指定长度元组,必须指定一个类型,后跟逗号和......注意 typing.Protocol使得可以注释“类型由支持操作定义”中提到double函数不会失去功能。关键是定义一个带有__mul__方法协议类。我邀请你将其作为练习完成。...Any、Optional、Union和NoReturn与内存中实际对象无关,仅存在于类型系统抽象领域中。 我们研究了参数化泛型和类型变量,这为类型提示带来了更多灵活性,不会牺牲类型安全性。

38310
  • Python高手必修课:如何让 Python 代码更易读,推荐收藏

    有了这样声明,以后我们如果看到这个方法定义,我们就知道传入参数类型了,如调用 add 方法时候,我们就知道传入需要是一个数值类型变量,不是字符串类型,非常直观。...但值得注意是,这种类型和变量注解实际上只是一种类型提示,对运行实际上是没有影响,比如调用 add 方法时候,我们传入不是 int 类型,而是一个 float 类型,它也不会报错,也不会对参数进行类型转换...另外也有一些库是支持类型检查,比如 mypy,安装之后,利用 mypy 即可检查出 Python 脚本中不符合类型注解调用情况。...) 这里将 Set 用作了返回值类型注解,将 AbstractSet 用作了参数类型注解。...但如果我们将参数声明为 object 类型,静态参数类型检查便会抛出错误, Any 则不会,具体可以参考官方文档说明:https://docs.python.org/zh-cn/3/library/

    79410

    使用类型注解让 Python 代码更易读

    有了这样声明,以后我们如果看到这个方法定义,我们就知道传入参数类型了,如调用 add 方法时候,我们就知道传入需要是一个数值类型变量,不是字符串类型,非常直观。...但值得注意是,这种类型和变量注解实际上只是一种类型提示,对运行实际上是没有影响,比如调用 add 方法时候,我们传入不是 int 类型,而是一个 float 类型,它也不会报错,也不会对参数进行类型转换...另外也有一些库是支持类型检查,比如 mypy,安装之后,利用 mypy 即可检查出 Python 脚本中不符合类型注解调用情况。...) 这里将 Set 用作了返回值类型注解,将 AbstractSet 用作了参数类型注解。...但如果我们将参数声明为 object 类型,静态参数类型检查便会抛出错误, Any 则不会,具体可以参考官方文档说明:https://docs.python.org/zh-cn/3/library/

    2.1K50

    使用类型注解让 Python 代码更易读

    有了这样声明,以后我们如果看到这个方法定义,我们就知道传入参数类型了,如调用 add 方法时候,我们就知道传入需要是一个数值类型变量,不是字符串类型,非常直观。...但值得注意是,这种类型和变量注解实际上只是一种类型提示,对运行实际上是没有影响,比如调用 add 方法时候,我们传入不是 int 类型,而是一个 float 类型,它也不会报错,也不会对参数进行类型转换...另外也有一些库是支持类型检查,比如 mypy,安装之后,利用 mypy 即可检查出 Python 脚本中不符合类型注解调用情况。...) 这里将 Set 用作了返回值类型注解,将 AbstractSet 用作了参数类型注解。...但如果我们将参数声明为 object 类型,静态参数类型检查便会抛出错误, Any 则不会,具体可以参考官方文档说明:https://docs.python.org/zh-cn/3/library/

    84530

    深入理解 Python 类型提示

    后者是 Python(以及 PHP、Ruby 和类似的脚本语言)工作原理。 硬件如何知道如何将这些 0 和 1 存储在内存中?软件也就是我们代码需要告诉硬件该如何为数据分配内存。...还有些场合,我们需要对类型做严格检查来保证他们不会违反我们程序一些约束。 不过这些类型到底是什么?我们又为什么需要他们呢? 下面就是类型系统发挥作用地方。...起初体验有点恼火,感觉好像只是放慢了我速度, Python 本可以完全只让我做我所想做,即便我偶尔出错也没关系。...如果我们以类似 Java 或者 C 方式写一段代码,我们在 CPython 解释器执行有答题代码行之前不会遇到任何错误。 对于编写大量代码团队而言,这已被证明是不方便。...第二,通过模块,有几种复杂类型可用: 字典、元组、列表、集合等。 例如,字典 [str, float] 表示你想检查一个字典,其中键是字符串类型,值是浮点数类型。

    1.2K30

    流畅 Python 第二版(GPT 重译)(八)

    Python 字典有时被用作记录,其中键用作字段名称,不同类型字段值。...示例 15-9 第二点非常重要要记住:Mypy 不会在这段代码中标记任何问题,但在运行时,whatever中值可能不符合BookDict结构—实际上,它可能根本不是dict!...② Mypy 将正确推断first是一个int… ③ … remain是一个整数元组。 此外,Mypy 还报告了参数化类型违规情况,并提供了有用消息,就像 示例 15-16 中显示那样。...Mypy 可以正确分析直接生成字符串不经过enumerate索引更简单实现,因此不需要cast()。...因此,该运算符不再是一个旁注,而是在“使用 @ 作为中缀运算符”章节流中整合了进去。我利用鹅类型使 __matmul__ 实现比第一版更安全,不会影响灵活性。

    21710

    Python 3.8已正式发布,重要新功能都在这里了

    你可以使用pip从PyPI安装Mypy: $ python -m pip mypy 从某种意义上说,Mypy是Python类型检查器参考实现,并在Jukka Lehtasalo领导下由Dropbox...你也可以将TypedDict纯粹用作注释: py38: PythonVersion = {"version": "3.8", "release_year": 2019} Mypy会告知你任何值类型错误...is和==之间区别可能会造成混淆。后者用于检查是否有相等值,只有在对象相同时才为true。...当忘记元组列表中逗号时会发出让你不解不可调用元组错误消息。Python 3.8不仅会发出警告,还会指出实际问题: >>> [ ... (1, 3) ......首先,如果在 Python3.8 中运行 3.7 版本代码,问题应该不会很大;Python3.8 beta版本也试用几个月了,也解决了不少问题,如果能升级到Python3.8,肯定也是安全,还能在新版本中进行优化

    3K51

    @程序员:Python 3.8正式发布,重要新功能都在这里

    你可以使用pip从PyPI安装Mypy: $ python -m pip mypy 从某种意义上说,Mypy是Python类型检查器参考实现,并在Jukka Lehtasalo领导下由Dropbox...你也可以将TypedDict纯粹用作注释: py38: PythonVersion = {"version": "3.8", "release_year": 2019} Mypy会告知你任何值类型错误...is和==之间区别可能会造成混淆。后者用于检查是否有相等值,只有在对象相同时才为true。...当忘记元组列表中逗号时会发出让你不解不可调用元组错误消息。Python 3.8不仅会发出警告,还会指出实际问题: >>> [ ... (1, 3) ......首先,如果在 Python3.8 中运行 3.7 版本代码,问题应该不会很大;Python3.8 beta版本也试用几个月了,也解决了不少问题,如果能升级到Python3.8,肯定也是安全,还能在新版本中进行优化

    2.4K20

    使用 Mypy 检查 30 万行 Python 代码,总结出 3 大痛点与 6 个技巧!

    Mypy 在 2013 年切换到兼容 Python 语法, PEP-484 在 2015 年才推出。....由于有了这样安全出口,即使是随便写注解也不会生效。...(装饰器另一个问题是我前面提过@functools.lru_cache :由于装饰器最终定义了一个全新函数,所以如果你不正确地注解代码,就可能会出现严重令人惊讶错误。)...Mypy 作为一个库Mypy 可以用作一个运行时库!我们内部有一个工作流编排库,看起来有点像 Flyte 或 Prefect。...如前所述,Mypy 在每次运行后都会将类型检查结果缓存到磁盘——但是如果在新机器或新容器上运行 Mypy(就像在 CI 上一样),则不会有缓存好处。

    91620

    SqlAlchemy 2.0 中文文档(三十一)

    Mypy / Pep-484 对 ORM 映射支持 原文:docs.sqlalchemy.org/en/20/orm/extensions/mypy.html 当使用直接引用 Column 对象不是...原始表达式移动到一个函数调用中,这样可以仍然进行类型检查不与表达式左侧冲突。对于 Mypy 来说,左侧类型注释足以理解属性行为。 添加了User....原始表达式移到一个函数调用中,这将允许它仍然被类型检查不与表达式左侧发生冲突。对于 Mypy 来说,左侧类型注释足以理解属性行为。 为 User....在 1.4 版中更改:InstanceState现在被用作弱字典中键,不是实例本身。...警告 此方法建立监听器是全局,适用于所有映射器,并且不会被垃圾回收。只能对应用程序中永久类型使用as_mutable(),不是临时类型,否则会导致内存使用量无限增长。

    30120

    Python 3.8正式发布,重要新功能都在这里

    你可以使用pip从PyPI安装Mypy: $ python -m pip mypy 从某种意义上说,Mypy是Python类型检查器参考实现,并在Jukka Lehtasalo领导下由Dropbox...你也可以将TypedDict纯粹用作注释: py38: PythonVersion = {"version": "3.8", "release_year": 2019} Mypy会告知你任何值类型错误...is和==之间区别可能会造成混淆。后者用于检查是否有相等值,只有在对象相同时才为true。...当忘记元组列表中逗号时会发出让你不解不可调用元组错误消息。Python 3.8不仅会发出警告,还会指出实际问题: >>> [ ... (1, 3) ......首先,如果在 Python3.8 中运行 3.7 版本代码,问题应该不会很大;Python3.8 beta版本也试用几个月了,也解决了不少问题,如果能升级到Python3.8,肯定也是安全,还能在新版本中进行优化

    1.5K30

    流畅 Python 第二版(GPT 重译)(三)

    使用namedtuple构建类可以在需要元组任何地方使用,并且实际上,Python 标准库许多函数现在用于返回元组地方现在返回命名元组以方便使用,不会对用户代码产生任何影响。...但是b和c存在为类属性,b保存了b实例属性默认值,c只是一个不会绑定到实例类属性。...警告 很好是@dataclass拒绝了具有list默认值字段类定义。但是,请注意,这是一个部分解决方案,仅适用于list、dict和set。其他用作默认值可变值不会被@dataclass标记。...换句话说,元组不可变性实际上是指tuple数据结构物理内容(即它保存引用),不是扩展到所引用对象。 示例 6-5 说明了元组值因所引用可变对象更改发生变化情况。...元组中永远不会改变是它包含标识。 示例 6-5。

    10400

    NumPy 1.26 中文文档(五十八)

    这是由 C API 中PyArray_IntpConverter发出弃用警告。如果您 API 意图支持传递None,那么您应该在调用转换器之前检查None,以便能够区分None和()。...此更改不会影响np.array(list, dtype="(2)i,"),除非list本身包含至少一个数组。特别是,对于元组列表,行为不变。...) 以上更改不会影响 Python 标量: np.array([float("NaN")], dtype=np.int64) 保持不变(np.nan是 Python float,不是 NumPy...这个改变不会影响np.array(list, dtype="(2)i,"),除非list本身至少包含一个数组。特别地,对于元组列表,行为没有改变。...这个改变不会影响np.array(list, dtype="(2)i,"),除非list本身至少包含一个数组。特别地,对于元组列表,行为没有改变。

    19810

    让你 Python 静态起来

    然而对于这样写法,IDE 可能不会有明显提示,所以在我们做大段代码重构或迁移时,它们很容易被忽略,直到运行时才会冒出来。...Protocol 好处是,我们可以很明确定义和使用鸭子类型,不用人工核对方法输入输出。...mypy mypy 原来是一个兼容大部分 Python 语法静态类型 Python 发行版,后来在官方受到启发,并加入类型注解之后,mypy 已经演化成了一个静态类型检查器,我们可以通过 pip 来安装...,可以考虑将 mypy 放到 CI 流程中。...: 好了,只要加上了类型注解,那个 企图让所有变量都变成元组 "元凶"——逗号,就无处遁形了 xD 结语 类型注解给 Python 带来了全新开发体验,相信此刻你也有了答案,让 Python

    95560

    爬虫(108)Python 3.8超酷新功能(接近一万字,请耐心享用,而且建议收藏)

    但是请记住,如果没有它,海象运算符不会做任何不可能事情。它只会使某些构造更加方便,并且有时可以更清楚地传达代码意图。 一种显示海象运算符优势模式是while循环,您需要在循环中初始化和更新变量。...您可以使用以下方法从PyPI安装Mypy pip: $ python -m pip install mypy 从某种意义上说,Mypy是Python类型检查器参考实现,并在 Jukka Lehtasalo...ID += 1 Mypy将突出显示该行ID += 1,并注意您Cannot assign to final name "ID"。这为您提供了一种确保代码中常量永远不会更改其值方法。...您也可以TypedDict纯粹用作注释: py38: PythonVersion = {"version": "3.8", "release_year": 2019} Mypy会告知您任何值类型错误...忘记元组列表中逗号将给出有关元组不可调用混乱错误消息。Python 3.8还会发出警告,指出实际问题: >>> [ ... (1, 3) ...

    2.6K20

    流畅 Python 第二版(GPT 重译)(九)

    abc.Iterator[str] 与abc.Generator[str, None, None] 一致,因此 Mypy 在示例 17-36 类型检查中不会发出错误。...我们在 “元组不仅仅是不可变列表” 中看到,我们可以将 tuple 实例用作记录或不可变序列。当用作记录时,预期元组具有特定数量项目,并且每个项目可能具有不同类型。...当用作不可变列表时,元组可以具有任意长度,并且所有项目都预期具有相同类型。...,typing 模块作者决定将该类型命名为 Generator,实际上它描述了旨在用作协程生成器对象 API,而生成器更常用作简单迭代器。...多亏了这个isinstance检查… ④ …Mypy 允许我将term添加到total中,不会出现错误,即我无法将float添加到可能是float或Sentinel对象中。

    23710

    特征选择与提取最全总结之过滤法

    额外特征可能扰乱算法正常工作,这些额外特征间相关性和模式没有实际应用价值(这种情况在小数据集上很常见)。只选择合适特征有助于减少出现没有实际意义相关性几率。...scikit-learn中VarianceThreshold转换器可用来删除特征值方差达不到最低标准特征。...这两个转换器都提供计算特征表现一系列方法。都将得分函数作为输入,返回单变量得分和p值。...卡方检验返回卡方值和P值两个统计量,其中卡方值很难界定有效范围,p值,我们一般使用0.01或0.05作为显著性水平,即p值判断边界。...,column], Y) scores.append(abs(cur_score)) pvalues.append(cur_p) #函数最后返回包含皮尔逊相关系数和p值元组

    2.7K21
    领券