2016-08-08 13 views
3

現在のプロジェクトでタイプ注釈を実装しようとしていますが、わからないmypyからエラーが発生しています。mypy "無効なタイプ"エラー

私はPython 2.7.11を使用していて、自分のベースvirtualenvに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を実行するには、以下を返します。

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

上記のタイプはTypeshedにあるように見える... mypy documentationはMypyがtypeshedプロジェクトを組み込んだ」と言い、そのPythonの組み込み関数と標準ライブラリのためのライブラリスタブが含まれています。 "..."組み込み "とは何を意味するのですか? - "活性化 "するために何かする必要がありますか? Typesedはローカルにダウンロードしてインストールする必要がありますか?

答えて

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の詳細については、こちらをご覧ください。

A表現のわずかに少ないクリーンな方法これを行うには、次のようになります。

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をインストールしてください。

+0

詳細な説明をいただきありがとうございます。大変感謝しています。 –