web-dev-qa-db-ja.com

python関数、mypy、複数の戻り値の型で注釈が付けられています)からNoneを返します

私はTypeScriptのバックグラウンドを持っています。私が取り組んでいるpythonプロジェクト(mypyを使用)に静的型チェックを導入しています。

TypeScriptでは、他の何か、つまり文字列を返すように注釈が付けられた関数からnullを返すことが有効です。

function test(flag: boolean): string {
    if(flag) {
        return 'success';
    } else {
        return null;
    }
}

複数の潜在的な戻り値の型、つまり文字列またはブール値を持つように関数に注釈を付けることも有効です。

function test(flag: boolean): string | boolean {
    if(flag) {
        return 'success';
    } else {
        return false;
    }
}

しかし、mypyを使用するpythonでは、strを返すように注釈が付けられた関数からNoneを返すことは許可されていません。

def test(flag: bool) -> str:
    if flag:
        return 'success'
    else:
        return None
        # [mypy] error:Incompatible return value type (got "None", expected "str")

さらに、複数の戻り値の型に注釈を付ける方法がわかりません。つまり、str | None

Mypyを使用してこのようなものにどのようにアプローチする必要がありますか?エラー状態からNoneを返す関数は、私のコードベース全体にあります。

8
Corey Cole

さて、mypy gitterの@zsolのおかげで、ドキュメントに欠けていたものが見つかりました!

2つの便利なmypy機能は、PythonのタイピングモジュールからインポートできるOptionalタイプとUnionタイプです。 ドキュメントはこちら

関数がプライマリタイプに加えてNoneを返す可能性があることに注釈を付ける場合、つまりstrOptionalを使用します。

from typing import Optional

def test(flag: bool) -> Optional[str]:
    if flag:
        return 'success'
    else:
        return None

関数が複数の型を返す可能性があることに注釈を付けたい場合、つまりstr | boolUnionを使用:

from typing import Union

def test(flag: bool) -> Union[str, bool]:
    if flag:
        return 'success'
    else:
        return False
14
Corey Cole