mypyエラー-「Union」を使用しているにもかかわらず互換性のないタイプ

Jan Rozycki

次のコードサンプルを検討してください。

from typing import Dict, Union

def count_chars(string) -> Dict[str, Union[str, bool, int]]:
    result = {}  # type: Dict[str, Union[str, bool, int]]

    if isinstance(string, str) is False:
        result["success"] = False
        result["message"] = "Inavlid argument"
    else:
        result["success"] = True
        result["result"] = len(string)
    return result

def get_square(integer: int) -> int:
    return integer * integer

def validate_str(string: str) -> bool:
    check_count = count_chars(string)
    if check_count["success"] is False:
        print(check_count["message"])
        return False
    str_len_square = get_square(check_count["result"])
    return bool(str_len_square > 42)

result = validate_str("Lorem ipsum")

このコードに対してmypyを実行すると、次のエラーが返されます。

error: Argument 1 to "get_square" has incompatible type "Union[str, bool, int]"; expected "int"

そしてDict[str, Any]、最初の関数で返された型として使用するか、「TypedDict」mypy拡張機能をインストールせずに、このエラーを回避する方法がわかりませんmypyは実際には「正しい」ですか、私のコードはタイプセーフではありませんか、それともmypyのバグと見なす必要がありますか?

Michael0x2a

Mypyはここで正しいです-dictの値がstrs、ints、またはboolsである可能性がある場合、厳密に言えば、check_count["result"]常に正確にintに評価されるは限りません

これを解決する方法はいくつかあります。最初の方法は、実際にのタイプをチェックしてcheck_count["result"]それがintであるかどうかを確認することです。これは、assertを使用して実行できます。

assert isinstance(check_count["result"], int)
str_len_square = get_square(check_count["result"])

...またはおそらくifステートメント:

if isinstance(check_count["result"], int):
    str_len_square = get_square(check_count["result"])
else:
    # Throw some kind of exception here?

Mypyは、assertおよびifステートメントでのこの形式の型チェックを理解します(限られた範囲で)。

ただし、これらのチェックをコード全体に分散させるのは面倒な場合があります。したがって、実際にはdictの使用をあきらめて、クラスの使用に切り替えるのが最善かもしれません。

つまり、クラスを定義します。

class Result:
    def __init__(self, success: bool, message: str) -> None:
        self.success = success
        self.message = message

...代わりにそのインスタンスを返します。

これ、最終的にjsonを返す/操作することが目標である場合、このクラスをjsonとの間で変換するコードを記述する必要があるという点で少し不便ですが、型関連のエラーを回避できます。

カスタムクラスの定義は少し面倒になる可能性があるため、代わりにNamedTupleを使用してみてください

from typing import NamedTuple
Result = NamedTuple('Result', [('success', bool), ('message', str)])
# Use Result as a regular class

タプル-> jsonコードを記述する必要があり、iircのnamedtuples(collectionsモジュールの通常バージョンとこの型付きバリアントの両方)はクラスよりもパフォーマンスが低くなりますが、おそらくそれはユースケースにとって重要ではありません。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Mypyエラー-割り当てに互換性のないタイプ

分類Dev

データ型に互換性があるにもかかわらず、配列割り当てに互換性がないのはなぜですか?

分類Dev

互換性のないタイプ "Optional [int]"としてエラーを与えるmypy; 期待される「Union [SupportsFloat、str、bytes、bytearray]

分類Dev

mypy UnionとネストされたTypedDictを組み合わせると、mypyエラーが発生します:互換性のない戻り値

分類Dev

データ変換と正確な宛先データ型を使用しているにもかかわらず、SSISデータ変換エラー

分類Dev

エラー:互換性のないタイプvoid *からchar *に割り当てています

分類Dev

std :: mapがキータイプとして互換性のあるタイプを常に許可するとは限らないのはなぜですか?

分類Dev

Mypyは、オーバーライドされたメソッドで互換性のないスーパータイプエラーを報告します

分類Dev

mypyが基本的なタイプエラーを検出しない

分類Dev

戻り値について、double []をdoubleに変換するにはどうすればよいですか?(互換性のないタイプのエラー)

分類Dev

pytypeもmypyもタイプエラーについて不平を言っていませんか?

分類Dev

iOSデプロイメントターゲットを設定しているにもかかわらず、可用性の警告

分類Dev

「「NSArray *」から「NSMutableArray *」に割り当てられている互換性のないポインタタイプ」というエラーが表示されるのはなぜですか。キーを並べ替えている間?

分類Dev

以前のコードを使用しているにもかかわらず、ポインタが上下に移動しない

分類Dev

エラー:タイプ 'taus88_t' |を使用してタイプ 'struct taus88_t *'を初期化するときに互換性のないタイプ

分類Dev

Kotlinデータクラスから生成されたコードを使用すると「互換性のないタイプ」エラーが発生する

分類Dev

除外を使用しているにもかかわらず、SBTがこれらのライブラリを除外しないのはなぜですか?

分類Dev

データセットに保存されているタイプのエンコーダが見つかりません。適切な暗黙を提供しているにもかかわらずエラー

分類Dev

エラー:互換性のないタイプ:「何か」を「何か」に変換できません

分類Dev

マップに値としてのArrayListを入れて互換性のないタイプのエラー

分類Dev

エラー:互換性のないタイプ:メッセージをintに変換できませんか?

分類Dev

条件付きインポートのmypy「互換性のないインポート」エラー

分類Dev

エラー:互換性のないタイプ:doubleからfloatへの不可逆変換の可能性

分類Dev

エラー:互換性のないタイプ:doubleからfloatへの不可逆変換の可能性

分類Dev

エラー:互換性のないタイプ:doubleからintへの不可逆変換の可能性

分類Dev

TextIOタイプのUnionでのmypy属性エラー

分類Dev

Nが定数として定義されているにもかかわらず、「不明なタイプ名N」エラー

分類Dev

'a'の既知のプロパティではないため、 'routerLink'にバインドできません。ルーターモジュールを参照しているにもかかわらずエラーが発生する

分類Dev

コンポーネントに適用されない角度スタイル(ホストセレクターを使用しているにもかかわらず)

Related 関連記事

  1. 1

    Mypyエラー-割り当てに互換性のないタイプ

  2. 2

    データ型に互換性があるにもかかわらず、配列割り当てに互換性がないのはなぜですか?

  3. 3

    互換性のないタイプ "Optional [int]"としてエラーを与えるmypy; 期待される「Union [SupportsFloat、str、bytes、bytearray]

  4. 4

    mypy UnionとネストされたTypedDictを組み合わせると、mypyエラーが発生します:互換性のない戻り値

  5. 5

    データ変換と正確な宛先データ型を使用しているにもかかわらず、SSISデータ変換エラー

  6. 6

    エラー:互換性のないタイプvoid *からchar *に割り当てています

  7. 7

    std :: mapがキータイプとして互換性のあるタイプを常に許可するとは限らないのはなぜですか?

  8. 8

    Mypyは、オーバーライドされたメソッドで互換性のないスーパータイプエラーを報告します

  9. 9

    mypyが基本的なタイプエラーを検出しない

  10. 10

    戻り値について、double []をdoubleに変換するにはどうすればよいですか?(互換性のないタイプのエラー)

  11. 11

    pytypeもmypyもタイプエラーについて不平を言っていませんか?

  12. 12

    iOSデプロイメントターゲットを設定しているにもかかわらず、可用性の警告

  13. 13

    「「NSArray *」から「NSMutableArray *」に割り当てられている互換性のないポインタタイプ」というエラーが表示されるのはなぜですか。キーを並べ替えている間?

  14. 14

    以前のコードを使用しているにもかかわらず、ポインタが上下に移動しない

  15. 15

    エラー:タイプ 'taus88_t' |を使用してタイプ 'struct taus88_t *'を初期化するときに互換性のないタイプ

  16. 16

    Kotlinデータクラスから生成されたコードを使用すると「互換性のないタイプ」エラーが発生する

  17. 17

    除外を使用しているにもかかわらず、SBTがこれらのライブラリを除外しないのはなぜですか?

  18. 18

    データセットに保存されているタイプのエンコーダが見つかりません。適切な暗黙を提供しているにもかかわらずエラー

  19. 19

    エラー:互換性のないタイプ:「何か」を「何か」に変換できません

  20. 20

    マップに値としてのArrayListを入れて互換性のないタイプのエラー

  21. 21

    エラー:互換性のないタイプ:メッセージをintに変換できませんか?

  22. 22

    条件付きインポートのmypy「互換性のないインポート」エラー

  23. 23

    エラー:互換性のないタイプ:doubleからfloatへの不可逆変換の可能性

  24. 24

    エラー:互換性のないタイプ:doubleからfloatへの不可逆変換の可能性

  25. 25

    エラー:互換性のないタイプ:doubleからintへの不可逆変換の可能性

  26. 26

    TextIOタイプのUnionでのmypy属性エラー

  27. 27

    Nが定数として定義されているにもかかわらず、「不明なタイプ名N」エラー

  28. 28

    'a'の既知のプロパティではないため、 'routerLink'にバインドできません。ルーターモジュールを参照しているにもかかわらずエラーが発生する

  29. 29

    コンポーネントに適用されない角度スタイル(ホストセレクターを使用しているにもかかわらず)

ホットタグ

アーカイブ