Làm thế nào các loại giống hệt nhau có thể không tương thích trong MyPy?


7

Với ví dụ sau:

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 nói:

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]")

Dường như mypy diễn giải new_find_fixed_pointnhư là một hàm chung với khởi tạo riêng ThetaTypeXType.
user2357112 hỗ trợ Monica

@ user2357112supportsMonica Bạn có biết cách khắc phục không?
Neil G

1
Hãy xem github.com/python/mypy/issues/708 , có vẻ như là một vấn đề đã biết không phải là ưu tiên. Xác nhận nếu nó liên quan vui lòng
Harsha Goli

1
@HarshaGoli: Thoạt nhìn có vẻ tương tự, nhưng dường như đây là một vấn đề hoàn toàn khác do cách xử lý các phương pháp.
user2357112 hỗ trợ Monica

1
@NeilG: Cá nhân tôi sẽ coi đó là một lỗi hoặc sự thiếu hụt trong mypy.
user2357112 hỗ trợ Monica

Câu trả lời:


0

Tôi không chắc chắn tôi đồng ý với tiền đề của câu hỏi này.

Đây là một phần của chuỗi từ 3,8

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):
    ....

Bây giờ, nếu bạn đã có

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

bạn có thể tranh luận rằng việc sử dụng ThetaType nên được coi là sử dụng của XType, mặc dù 2 kiểu chữ khác nhau đã được thiết lập? Tại sao việc thêm boundđối số tùy chọn sẽ tự động thu gọn chúng lại với nhau? Nguồn không thực thi sự hiện diện của ràng buộc, hoặc bất kỳ đối số nào bên cạnh tên, theo bất kỳ cách nào.

Tôi không nghĩ rằng đó là công việc đánh máy / mypy để suy ra ý định của bạn trong khai báo kiểu , chỉ để kiểm tra của bạn so với ý định loại khai báo của bạn . Nếu bạn có nghĩa là chúng giống nhau thì chỉ khai báo 1 TypeVar. Xem xét chúng giống nhau có thể mất một số ý nghĩa ngữ nghĩa nếu bạn có lý do thực tế để có 2.

Tôi sẽ thêm vào đó boundcho phép linh hoạt hơn so với constraintskhi nó phù hợp với các lớp con. Giả sử bạn đã xác định 4 lớp con của int. Int1 (int), Int2, Int3, Int4 .... Bây giờ bạn đã quyết định phân vùng mã của mình trong đó một số mã chỉ nên chấp nhận Int1 và Int2. Typevarint12 có thể phần nào thể hiện điều đó, mặc dù tất cả các lớp con của bạn đều khớp bound=int.


Vâng, hai loại là khác nhau. Tôi không nghĩ rằng nó quan trọng cho câu hỏi này mặc dù.
Neil G

1
@NeilG thì có lẽ bạn nên sửa đổi câu hỏi của mình để tiêu đề và nhận xét của bạn liên quan đến mã cụ thể của bạn cho thấy hành vi không mong muốn này cho biết lý do tại sao bạn mong đợi điều gì đó khác biệt. Ngay bây giờ, tôi không thấy gì trong chính khối xây dựng TypeVar chỉ ra lý do tại sao 2 kiểu chữ nên hoạt động giống nhau. Nếu cách bạn thiết lập mã xung quanh TypeVar sẽ dẫn đến sự tương đương, thì vui lòng giải thích điều đó, nhưng đừng ghim nó chỉ trên TypeVar .
JL Peyret

Tôi không bao giờ nói rằng hai kiểu chữ khác nhau nên cư xử giống nhau. Các lỗi cho thấy mỗi typevar không tương thích với chính nó. Đúng là tôi có thể đã tìm thấy một MWE nhỏ hơn, nhưng tôi không muốn đầu tư nhiều thời gian hơn vào việc này.
Neil G
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.