2017-02-03 4 views
4

Для следующего кодаTyping: несовместимый тип, когда объявляют typing.Type []

# -*- coding: utf-8 -*- 
import typing 


class A(object): 
    pass 

class B(A): 
    pass 

class C(A): 
    pass 

class D(A): 
    pass 

class E(A): 
    pass 

MAPPING_X = { 
    B: 'b', 
    C: 'c', 
} 
MAPPING_Y = { 
    D: 'd', 
    E: 'e', 
} 

all_mappings = {} # type: typing.Dict[typing.Type[A], str] 
all_mappings.update(MAPPING_X) 
all_mappings.update(MAPPING_Y) 

mypy возвращают следующие ошибки (питон 3.4):

t.py:30: error: Argument 1 to "update" of "dict" has incompatible type Dict[type, str]; expected Mapping[Type[A], str] 
t.py:31: error: Argument 1 to "update" of "dict" has incompatible type Dict[type, str]; expected Mapping[Type[A], str] 

Я не понимаю, как я хочу указать подклассы A в качестве ключей Dict. Как объявить тип?

+0

@JacquesGaudin OP использует модуль '' mypy' (http://mypy.readthedocs.io/en/latest/basics.html) для проверки типа. Это приводит к ошибке. –

+0

@RickTeachey Спасибо, я этого не осознавал. –

ответ

0

Возможно, я не понимаю, как работают модули typing и mypy, но, похоже, здесь происходит какая-то ошибка. Если я делаю это (пример адаптированный из typing.Type части docs):

import typing 

class User(): pass 
class BasicUser(User): pass 

def make_new(u: typing.Type[User]) -> User: 
    return u() 

x = make_new(BasicUser) 

Там нет mypy ошибки. Если я это сделаю:

import typing 

class A(): 
    pass 

MAPPING_X = { 
    A: 'a', 
} 
all_mappings = {} # type: typing.Dict[typing.Type[A], str] 
all_mappings.update(MAPPING_X) 

Существует также никаких ошибок. Тем не менее, это делает производить mypy ошибку:

import typing 

class A(): 
    pass 

class B(A): 
    pass 

MAPPING_X = { 
    A: 'a', 
    B: 'b', 
} 

all_mappings = {} # type: typing.Dict[typing.Type[A], str] 
all_mappings.update(MAPPING_X) 

Основываясь на моем понимании документации, эта ошибка не должна случаться.

0

Похоже, вы делаете это правильно, но сначала необходимо объявить типы для MAPPING_X и MAPPING_Y. Это устраняет проблему.

# -*- coding: utf-8 -*- 
import typing 

class A(object): 
    pass 

class B(A): 
    pass 

class C(A): 
    pass 

class D(A): 
    pass 

class E(A): 
    pass 

MAPPING_X = {} # type: typing.Dict[typing.Type[A], str] 
MAPPING_Y = {} # type: typing.Dict[typing.Type[A], str] 

MAPPING_X = { 
    B: 'b', 
    C: 'c', 
} 
MAPPING_Y = { 
    D: 'd', 
    E: 'e', 
} 

all_mappings = {} # type: typing.Dict[typing.Type[A], str] 
all_mappings.update(MAPPING_X) 
all_mappings.update(MAPPING_Y) 

No mypy ошибки.

Однако, мне кажется, что ваш код как написанный должен работать, и что это признак ошибки.

Смежные вопросы