2017-05-31 22 views
1

我有幾個共享某些字段的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

我應該只是放棄這個想法?

回答

1

PEP 544提出了一個類型系統的擴展,將允許結構分類(靜態鴨子打字)。另外,運行時實現typing.NamedTuple將很快得到改進,可能在6月底的Python 3.6.2中(這也將通過PyPI上的typing回溯)。

+0

謝謝。我想你不知道我可以使用的任何優雅的解決方法,直到3.6.2?如果是這種情況,我會接受答案並繼續前進。 – wuzwm

+1

@wuzwm不,不幸的是我不知道。 – ivanl

相關問題