从 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 不是这里的选项。
看来答案很简单——我只是颠倒了 Generic
和 NamedTuple
的顺序,它适用于我们支持的所有 python 版本:
class A(NamedTuple('A', [('x', T)]), Generic[T]):
pass
我在尝试定义泛型 (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 不是这里的选项。
看来答案很简单——我只是颠倒了 Generic
和 NamedTuple
的顺序,它适用于我们支持的所有 python 版本:
class A(NamedTuple('A', [('x', T)]), Generic[T]):
pass