mypy AnyStrは、些細な例の割り当てで互換性のないタイプを提供します

イエティ

次のクラスが与えられます:

from typing import AnyStr

class A(object):

    def __init__(self, param):
        # type: (AnyStr) -> None
        self.a = param # type: AnyStr

次の出力が得られます。

$ mypy . -v
LOG:  Mypy version 0.521
LOG:  Build finished in 1.199 seconds with 10 modules, 2076 types, and 2 errors
test.py:8: error: Incompatible types in assignment (expression has type "str", variable has type "AnyStr")
test.py:8: error: Incompatible types in assignment (expression has type "bytes", variable has type "AnyStr"

この割り当て操作で互換性のないタイプが生成されるのはなぜですか?

ポール

私はmypyの専門家ではありませんが、少しの探偵の仕事で、これを理解したと思います。

問題

これはAnyStr、関数に渡された場合問題なく機能するようですが、変数がAnyStrとして入力された場合は失敗しますたとえば、これは正常に機能しているようです。

from typing import AnyStr

def f(a):
    # type: (AnyStr) -> AnyStr
    return a

if __name__ == "__main__":
    print(f('cat'))
    print(f(b'dog'))

しかし、これは失敗します:

from typing import AnyStr

c = 3   # type: AnyStr

エラーあり:

mypy_anystr.py:3: error: Invalid type "typing.AnyStr"

ドキュメントAnyStrからの、の考え方はまたはのいずれかを意図しているためですが、特定の関数呼び出しの範囲内一貫している必要があるため、これは理にかなっています。彼らが使用法について与える例は次のとおりです。 strbytesAnyStr

def concat(a, b):
    #type: (AnyStr, AnyStr) -> AnyStr
    return a + b

concat('one', 'two')        # OK
concat(b'three', b'four')   # OK
concat('five', b'six')      # Error

もちろん、AnyStrがグローバルでない限り(そして上記の例がそうではないことを示している)、元のAnyStr変数のスコープ外の変数(たとえば、グローバル、またはクラスの属性)を割り当てることは意味がありません。なぜ失敗するのか。エラーメッセージはこれについてはるかに明確である可能性があると思います。

ソリューション

実際に達成したいことに応じて、ここにはいくつかの解決策があります。strとの本当に不可知論者である場合はbytes、次を使用できますUnion[Text, bytes]

import Union、Text、AnyStrの入力から

class A:
    def __init__(self, a):
        #type: (AnyStr) -> None
        self.param = a  # type: Union[Text, bytes]

この場合AnyStr、入力で使用したことに注意してください。ただし、この場合Union[Text, bytes]、パラメーターが1つしかないためと同等です。あなたが実際にあれば別の方法として、やるパラメータがあるかどうかを気にstrbytes、あなただけ取ることができAnyStr、あなたが積極的にしたいバージョンに変換します。

from typing import Union, Text, AnyStr
from six import binary_type
class A:
    def __init__(self, a):
        #type: (AnyStr) -> None
        if isinstance(a, binary_type):
            b = a.decode()  # type: Text
        else:
            b = a

        self.param = b  # type: Text

a奇妙なロケールなどでエンコードされている場合、これはファンキーになる可能性があることに注意してください。したがって、これは単純化された例であり、bytesオブジェクトをアクティブにデコードしようとする場合はYMMVであることに注意してください

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

mypy AnyStrは、些細な例の割り当てで互換性のないタイプを提供します

分類Dev

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

分類Dev

mypy:スーパータイプ「タプル」と互換性のない「__add__」の署名-しかし、__ sub__ですべて問題ありません

分類Dev

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

分類Dev

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

分類Dev

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

分類Dev

Mypyは互換性のない署名エラーを生成しますが、リスコフの置換原則は満たされています

分類Dev

mypyジェネリックサブクラスは互換性のない型につながります

分類Dev

mypyはIO [bytes]がBinaryIOと互換性がないと宣言します

分類Dev

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

分類Dev

mypyと同等のタイプ

分類Dev

mypy:スーパータイプと互換性のないメソッドの引数

分類Dev

Mypy:平均的な関数の完璧な署名を探しています

分類Dev

MypyはTypeVarタイプの境界を無視しているようです

分類Dev

mypyエラー:代入に互換性のない型があります(式の型は「List [str]」、変数の型は「str」)

分類Dev

mypyをawaitで使用する

分類Dev

mypyエラー、Union / Optionalでのオーバーロード、「オーバーロードされた関数シグネチャ1および2は互換性のない戻り値型と重複しています」

分類Dev

異なるタイプの変数の等価性チェックについてmypyに警告させます

分類Dev

Mypy:関数の辞書と互換性のない型(オブジェクト)

分類Dev

Mypy:より高い(個人的な)タイプを使用する

分類Dev

Python 3:mypyで型推論?

分類Dev

Mypyタイプの連結タプル

分類Dev

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

分類Dev

Python mypyタイプヒントshutil.copyfileobj()のタイプは互換性がありません "Union [HTTPResponse、BinaryIO]"; 期待されるIO [任意]

分類Dev

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

分類Dev

mypy:「__ eq__」はスーパータイプ「オブジェクト」と互換性がありません

分類Dev

mypyの計算されたタイプ

分類Dev

PyCharmはMypyを使用しますか?

分類Dev

VSCode MyPyエラー:「ioctl」のタイプは互換性がありません「my_struct」。期待される「Union [int、str]」

Related 関連記事

  1. 1

    mypy AnyStrは、些細な例の割り当てで互換性のないタイプを提供します

  2. 2

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

  3. 3

    mypy:スーパータイプ「タプル」と互換性のない「__add__」の署名-しかし、__ sub__ですべて問題ありません

  4. 4

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

  5. 5

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

  6. 6

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

  7. 7

    Mypyは互換性のない署名エラーを生成しますが、リスコフの置換原則は満たされています

  8. 8

    mypyジェネリックサブクラスは互換性のない型につながります

  9. 9

    mypyはIO [bytes]がBinaryIOと互換性がないと宣言します

  10. 10

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

  11. 11

    mypyと同等のタイプ

  12. 12

    mypy:スーパータイプと互換性のないメソッドの引数

  13. 13

    Mypy:平均的な関数の完璧な署名を探しています

  14. 14

    MypyはTypeVarタイプの境界を無視しているようです

  15. 15

    mypyエラー:代入に互換性のない型があります(式の型は「List [str]」、変数の型は「str」)

  16. 16

    mypyをawaitで使用する

  17. 17

    mypyエラー、Union / Optionalでのオーバーロード、「オーバーロードされた関数シグネチャ1および2は互換性のない戻り値型と重複しています」

  18. 18

    異なるタイプの変数の等価性チェックについてmypyに警告させます

  19. 19

    Mypy:関数の辞書と互換性のない型(オブジェクト)

  20. 20

    Mypy:より高い(個人的な)タイプを使用する

  21. 21

    Python 3:mypyで型推論?

  22. 22

    Mypyタイプの連結タプル

  23. 23

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

  24. 24

    Python mypyタイプヒントshutil.copyfileobj()のタイプは互換性がありません "Union [HTTPResponse、BinaryIO]"; 期待されるIO [任意]

  25. 25

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

  26. 26

    mypy:「__ eq__」はスーパータイプ「オブジェクト」と互換性がありません

  27. 27

    mypyの計算されたタイプ

  28. 28

    PyCharmはMypyを使用しますか?

  29. 29

    VSCode MyPyエラー:「ioctl」のタイプは互換性がありません「my_struct」。期待される「Union [int、str]」

ホットタグ

アーカイブ