5

現在のプロジェクトに型注釈を実装しようとしていますが、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 のドキュメントには、「Mypy には、Python ビルトインと標準ライブラリのライブラリ スタブを含む typeshed プロジェクトが組み込まれています。」と記載されています。 Typeshed を「アクティブ化」する、またはパスを提供するために何かをするには? Typeshed をローカルにダウンロードしてインストール (?) する必要がありますか?

4

1 に答える 1

7

問題は、一連types.StringTypesの型として定義されていることです。Typeshedの正式な型シグネチャは次のとおりです。

StringTypes = (StringType, UnicodeType)

これは、定数が「およびを含むシーケンスである」と述べている公式ドキュメントに対応しています...StringTypesStringTypeUnicodeType

それで、これはあなたが得ているエラーを説明しています-StringTypes実際のクラスではない(おそらくタプルです)ので、mypyはそれを有効なタイプとして認識しません。

これにはいくつかの修正方法があります。

最初の方法は、おそらくtyping.AnyStrwhich が として定義されているものを使用することですAnyStr = TypeVar('AnyStr', bytes, unicode)AnyStrはモジュール内に含まれていますtypingが、残念ながら、現時点では文書化が不十分です。これが何をするかについてのより詳細な情報は、 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 をインストールするとデフォルトでバンドルされます。理想的な世界では、typeshed についてまったく心配する必要はありませんが、mypy はベータ版であり、不足しているモジュールや不適切な型注釈を考慮して typeshed が頻繁に更新されているため、Githubから mypy を直接インストールする価値があるかもしれません。 typeshed のバグに頻繁に遭遇する場合は、 repoと typeshed をローカルにインストールしてください。

于 2016-08-08T22:56:13.603 に答える