You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

继承Generic与NamedTuple在Python3.5.3报缺少必选参数错误如何解决

问题根源

该报错是Python 3.5.3版本内置typing模块的已知实现缺陷:Generic的构造逻辑_generic_new没有将传入的位置、关键字参数透传给后续基类的__new__方法,导致构造NamedTuple时参数被丢弃。你之前手动加__new__仍报错的原因是super()调用还是会触发有缺陷的Generic构造逻辑,没有真正绕开问题。

可行解决方法

以下两种方案均兼容Python 3.4、3.5.3、3.7+所有你需要支持的版本,同时不影响mypy的泛型校验:

方案1:重写__new__直接调用NamedTuple基类构造

无需修改现有调用逻辑,兼容原有使用习惯:

from typing import NamedTuple
from typing import Generic
from typing import TypeVar

T = TypeVar('T')

# 先单独定义NamedTuple基类,不要直接写在继承列表中
A_Base = NamedTuple('A_Base', [('x', T)])

class A(Generic[T], A_Base):
    def __new__(cls, x: T):
        # 直接调用NamedTuple基类的__new__,绕开Generic的有缺陷构造逻辑
        return A_Base.__new__(cls, x)

# 原有调用方式完全不变
a = A(12)

方案2:新增工厂函数构造实例

如果不想修改原有类的继承结构,可以新增工厂函数替代直接类构造:

from typing import NamedTuple
from typing import Generic
from typing import TypeVar

T = TypeVar('T')

# 原有类定义完全不变
class A(Generic[T], NamedTuple('A', [('x', T)])):
    pass

# 新增工厂函数,直接调用tuple底层构造方法
def build_a(x: T) -> A[T]:
    return tuple.__new__(A, (x,))

# 调用时替换原有A(xx)写法即可
a = build_a(12)

内容的提问来源于stack exchange,提问作者Jan Spurny

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 19:15:01