我有幾個共享某些字段的namedtuples。我有一個函數接受這些元組,並保證只與共享字段交互。我想在mypy中檢查這樣的代碼。爲了進行類型檢查而對NamedTuple進行子類化的一種方法
代碼的一個例子是:
from typing import NamedTuple
class Base(NamedTuple):
x: int
y: int
class BaseExtended(NamedTuple):
x: int
y: int
z: str
def DoSomething(tuple: Base):
return tuple.x + tuple.y
base = Base(3, 4)
base_extended = BaseExtended(5, 6, 'foo')
DoSomething(base)
DoSomething(base_extended)
當我在此代碼運行mypy我得到一個可預見的錯誤:
mypy_example.py:20: error: Argument 1 to "DoSomething" has incompatible type "BaseExtended"; expected "Base"
有沒有辦法來構建我的代碼,並保持mypy類型檢查?我無法從基本繼承BaseExtended,因爲有一個在NamedTuple繼承實現中的錯誤:
https://github.com/python/typing/issues/427
我不想用一個醜陋的「聯盟[基地,BaseExtended]」要麼,因爲這打破了我嘗試類型檢查列表,因爲「列表[聯盟[基地,BaseExtended]」不等於「列表[BaseExtended]」由於有關變量/協變類型的一些mypy法寶:
https://github.com/python/mypy/issues/3351
我應該只是放棄這個想法?
謝謝。我想你不知道我可以使用的任何優雅的解決方法,直到3.6.2?如果是這種情況,我會接受答案並繼續前進。 – wuzwm
@wuzwm不,不幸的是我不知道。 – ivanl