MyPyで同じ型に互換性がないのはなぜですか?


7

次の例では:

from typing import Callable, Generic, Type, TypeVar

ThetaType = TypeVar('ThetaType', bound=int)
XType = TypeVar('XType', bound=int)


class IteratedFunction(Generic[ThetaType, XType]):

    def find_fixed_point(self,
                         theta: ThetaType,
                         x_init: XType) -> XType:
        return x_init


def combinator(
    iterated_function_cls: Type[
        IteratedFunction[ThetaType, XType]]) -> Callable[
            [IteratedFunction[ThetaType, XType]], XType]:
    old_find_fixed_point = iterated_function_cls.find_fixed_point

    def new_find_fixed_point(
            iterated_function: IteratedFunction[ThetaType, XType],
            theta: ThetaType,
            x_init: XType) -> XType:
        return old_find_fixed_point(iterated_function, theta, x_init)

    return new_find_fixed_point

MyPyさんのコメント:

a.py:25: error: Incompatible return value type (got "XType", expected "XType")
a.py:25: error: Argument 1 has incompatible type "IteratedFunction[ThetaType, XType]"; expected "IteratedFunction[ThetaType, XType]"
a.py:25: error: Argument 2 has incompatible type "ThetaType"; expected "ThetaType"
a.py:25: error: Argument 3 has incompatible type "XType"; expected "XType"
a.py:27: error: Incompatible return value type (got "Callable[[IteratedFunction[ThetaType, XType], ThetaType, XType], XType]", expected "Callable[[IteratedFunction[ThetaType, XType]], XType]")

mypy new_find_fixed_pointThetaType、およびの独自のインスタンス化を持つ汎用関数として解釈されるようですXType
user2357112はモニカ

@ user2357112supportsMonicaどうすれば修正できるでしょうか?
Neil G

1
github.com/python/mypy/issues/708をご覧ください。優先度ではない既知の問題のようです。関連しているかどうか確認してください
Harsha Goli

1
@HarshaGoli:一見同じように見えますが、メソッドの処理方法に起因するまったく異なる問題のようです。
user2357112はモニカ

1
@NeilG:私は個人的にそれをmypyのバグまたは欠陥のどちらかと考えます。
user2357112はモニカ

回答:


0

この質問の前提に同意するかどうかはわかりません。

これは3.8のdocstringの一部です

class TypeVar(_Final, _Immutable, _root=True):
    """Type variable.
    Usage::
      T = TypeVar('T')  # Can be anything
      A = TypeVar('A', str, bytes)  # Must be str or bytes

    ....
    def __init__(self, name, *constraints, bound=None,
                 covariant=False, contravariant=False):
    ....

今、あなたがちょうど持っていた場合

ThetaType = TypeVar('ThetaType')
XType = TypeVar('XType')

2つの異なるtypevarが設定されていても、ThetaTypeの使用はXTypeの使用と見なされるべきだと主張しますか?boundオプションの引数を追加すると、自動的に元に戻されますか?ソースは、バウンドの存在、または名前以外の引数を強制しません。

私はそれがであなたの意図を推測するためにタイピング/ mypyの仕事だとは思わない型宣言のみご確認するために、コードをお使いの対宣言された型の意図を。それらが同じであることを意味する場合は、TypeVarを1つだけ宣言してください。それらを同じと見なすと、実際に2の理由がある場合、意味上の意味が失われる可能性があります。

これを追加して、サブクラスで一致するbound場合よりも柔軟性を高めますconstraints。たとえば、intの4つのサブクラスをユーザー定義したとします。Int1(int)、Int2、Int3、Int4 ....これで、一部のコードがInt1とInt2のみを受け入れるようにコードを分割することにしました。Typevarint12は、サブクラスがすべて一致する場合でも、それを多少表現できますbound=int


はい、2つのタイプは異なります。しかし、この質問には関係ないと思います。
Neil G

1
@NeilGでは、質問を変更して、この予期しない動作を示す特定のコードに関するタイトルとコメントが、何か違うものを期待している理由を示すようにする必要があります。現時点では、TypeVarビルディングブロック自体には何も表示されず、2つのtypevarが同じように動作する理由が示されています。TypeVarを中心にコードを設定する方法で同等になる場合は、それについて説明してください。ただし、TypeVarだけに固定しないでください
JL Peyret

2つの異なるtypevarが同じように動作するべきだとは言っていません。エラーは、各typevarがそれ自体と互換性がないことを示しています。小さいMWEを見つけたかもしれませんが、これにもっと時間をかけたくありませんでした。
Neil G
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.