我在嘗試定義泛型 (typing/mypy Generic)時遇到了問題NamedTuple。我已經設法將它減少到最小的作業示例:
一個.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 不是一個選項。
uj5u.com熱心網友回復:
答案似乎很簡單——我只是顛倒了Generic和 的順序,NamedTuple它適用于我們支持的所有 python 版本:
class A(NamedTuple('A', [('x', T)]), Generic[T]):
pass
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/377919.html
