2016-08-08 2 views
3

현재 프로젝트에서 유형 주석을 구현하려고하는데 이해가 안되는 mypy에서 오류가 발생합니다.mypy "잘못된 유형"오류

저는 파이썬 2.7.11을 사용하고 있습니다. 내 기본 가상 엔티티에 mypy를 새로 설치했습니다. 다음 프로그램이 잘 실행 :

from __future__ import print_function 
from types import StringTypes 
from typing import List, Union, Callable 

def f(value):  # type: (StringTypes) -> StringTypes 
    return value 

if __name__ == '__main__': 
    print("{}".format(f('some text'))) 
    print("{}".format(f(u'some unicode text'))) 

그러나 mypy --py2 -s mypy_issue.py을 실행하면 반환 다음 : 위의 유형 Typeshed에있는 것으로 나타

mypy_issue.py: note: In function "f": 
mypy_issue.py:8: error: Invalid type "types.StringTypes" 

을 ... mypy documentation는 Mypy가 typeshed 프로젝트를 통합 "라고하는 파이썬 내장 함수와 표준 라이브러리를위한 라이브러리 스텁을 포함합니다. "..."통합 "이 무엇을 의미하는지 확신하지 못합니다. -"활성화 "하거나 경로를 제공해야 할 필요가 있습니까? 로컬에 Typeshed를 다운로드하여 설치해야합니까?

답변

2

문제 types.StringTypes이 종류의 시퀀스되도록 정의된다는 것이다 - 가형 서명 on Typeshed된다 :이 StringTypes 상수 "는 중임 official documentation에 대응

StringTypes = (StringType, UnicodeType) 

StringTypeUnicodeType을 포함하는 시퀀스 "...

그러면 다음과 같은 오류가 발생합니다. StringTypes은 실제 클래스가 아닙니다. (아마도 튜플 일 것입니다.) 그래서 mypy는 그렇지 않습니다. 유효한 유형으로 인식하십시오.

여러 가지 가능한 수정 방법이 있습니다.

첫 번째 방법은 typing.AnyStr을 사용하는 것이고 AnyStr = TypeVar('AnyStr', bytes, unicode)으로 정의됩니다. AnyStrtyping 모듈에 포함되어 있지만, 불행히도 지금까지는 문서화가 잘되어 있지 않습니다. within the mypy docs에 대한 자세한 정보를 찾을 수 있습니다. 이 될 것이라고 표현의

약간 덜 청소기 방법이해야 할 일 :

from types import StringType, UnicodeType 
from typing import Union 

MyStringTypes = Union[StringType, UnicodeType] 

def f(value):  
    # type: (MyStringTypes) -> MyStringTypes 
    return value 

이 또한 작동하지만, 반환 형식이 더 이상 입력 유형과 같은 일을 할 의무가 있기 때문에 바람직하지 않습니다를하는 일반적으로 다른 종류의 문자열로 작업 할 때 원하는 것이 아닙니다.

그리고 typeshed - mypy를 설치할 때 기본적으로 번들됩니다. 이상적인 세상에서는 타입 화가 전혀 필요하지 않지만 mypy는 베타 버전이므로 누락 된 모듈이나 잘못된 유형의 주석을 처리하기 위해 자주 타입이 변경되므로 Github repo에서 직접 mypy를 설치해야합니다. typeshed가있는 버그가 자주 발생하면 typeshed를 로컬에 설치하십시오.

+0

철저히 설명해 주셔서 감사합니다. 대단히 감사합니다. –

관련 문제