2017-03-22 93 views
2

我正在使用各种存储后端的框架。这些后端都实现了一个抽象基类。后端类存储在从后端名称到实现该后端的类的映射中。Mypy:将抽象类作为值的映射的类型注释

我们希望能够进行类型与mypy检查和注释如下:

#!python 
import abc 
import typing 


class A(metaclass=abc.ABCMeta): # The abstract base class 
    def __init__(self, name: str) -> None: 
     self.name = name 

    @abc.abstractmethod 
    def get_name(self): 
     pass 


class B(A): # Some non-abstract backend 
    def get_name(self): 
     return f'B: {self.name}' 


class C(A): # Another non-abstract backend 
    def get_name(self): 
     return f'C: {self.name}' 


backends: typing.Mapping[str, typing.Type[A]] = { 
    'backend-b': B, 
    'backend-c': C, 
} 


if __name__ == '__main__': 
    backend_cls = backends['backend-c'] 
    # The following line causes an error with mypy: 
    instance = backend_cls('demo-name') 
    print(f'Name is: {instance.get_name()}') 

运行mypy-0.501给出了这样的错误:

typingtest.py:32: error: Cannot instantiate abstract class 'A' with abstract attribute 'get_name'

我的问题:我们如何注释映射backends,使mypy理解它只包含A的非抽象子类?

回答