从 Generic 和 NamedTuple 继承失败 "missing required positional argument"

Inheriting from Generic and NamedTuple fails with "missing required positional argument"

我在尝试定义泛型 (typing/mypy Generic) NamedTuple 时遇到问题。我已经设法将它减少到尽可能小的工作示例:

a.py:

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

T = TypeVar('T')

class A(Generic[T], NamedTuple('A', [('x', T)])):
    pass

a = A(12)

这在我们(必须)支持的所有 python 版本(包括 3.4、3.7)上完全没问题,除了 3.5.3,它失败了:

$ python3 a.py
Traceback (most recent call last):
  File "a.py", line 10, in <module>
    a = A(12)
  File "/usr/lib/python3.5/typing.py", line 1126, in __new__
    return _generic_new(cls.__next_in_mro__, cls, *args, **kwds)
  File "/usr/lib/python3.5/typing.py", line 1087, in _generic_new
    return base_cls.__new__(cls)
TypeError: __new__() missing 1 required positional argument: 'x'

我试过手动添加__new__方法:

class A(Generic[T], NamedTuple('A', [('x', T)])):
    def __new__(cls, a):
        return super(A, cls).__new__(cls, a)

但失败并显示完全相同的错误消息。

明确命名参数 x (a = A(x=12)) 也给出相同的错误消息。

有没有办法让它起作用?

请不要告诉我升级python,我们支持多个python版本,3.5.3就是其中之一。升级 python 不是这里的选项。

看来答案很简单——我只是颠倒了 GenericNamedTuple 的顺序,它适用于我们支持的所有 python 版本:

class A(NamedTuple('A', [('x', T)]), Generic[T]):
    pass