Python 3.8.5下定义元组类型注解时两种写法均触发TypeError
Python 3.8 元组类型注解定义错误与正确实现
问题现象
在Python 3.8.5环境下为元组编写类型注解时,参照mypy官方类型速查表的操作方法,两种尝试写法均触发运行报错,无法正常完成注解定义:
- 尝试写法1:
Tuple(float,str)
触发报错:Traceback (most recent call last): File "<ipython-input-30-7964c1934b1f>", line 1, in <module> Tuple(float,str) File "C:\Users\kinsm\anaconda3\lib\typing.py", line 727, in __call__ raise TypeError(f"Type {self._name} cannot be instantiated; " TypeError: Type Tuple cannot be instantiated; use tuple() instead - 尝试写法2:
tuple(float,str)
触发报错:Traceback (most recent call last): File "<ipython-input-29-fea16b9491a0>", line 1, in <module> tuple(float,str) TypeError: tuple expected at most 1 argument, got 2
错误成因
两类报错的核心是混淆了「运行时类的实例化调用语法」和「泛型类型注解的传参规则」:
typing模块提供的Tuple是泛型类型容器,本身不支持像普通业务类一样通过小括号调用生成实例,必须通过方括号下标传入元素类型参数,才能生成具体的泛型注解类型- Python 3.8 版本中,内置
tuple是原生运行时类,不支持泛型传参逻辑,对其用小括号传入多个类型参数时,会被解释为尝试调用tuple()构造方法实例化元组;而元组构造方法本身最多只接受1个可迭代入参,因此触发参数数量不匹配的报错
正确定义方式
Python 3.8 适配写法
需先从typing模块导入Tuple泛型类型,所有类型参数统一通过方括号传入:
# 导入泛型依赖 from typing import Tuple # 固定长度元组:逐位置指定元素类型,匹配「第一个元素为float、第二个元素为str」的场景 user_info: Tuple[float, str] = (185.3, "张三") # 不定长度同类型元素元组:通过...标记长度无上限,所有元素均为float类型 scores: Tuple[float, ...] = (92.5, 88.0, 76.3)
高版本简化写法
Python 3.9 及以上版本原生支持内置类型的泛型下标语法,无需额外从typing模块导入Tuple,可直接对内置tuple用方括号传参完成注解定义:
# 无需导入typing模块 user_info: tuple[float, str] = (185.3, "张三") scores: tuple[float, ...] = (92.5, 88.0, 76.3)
注意:Python 3.8 版本不支持直接对内置
tuple类使用方括号泛型语法,该写法同样会触发类型错误。
内容的提问来源于stack exchange,提问作者negfrequency
相关产品推荐
相关产品推荐

