第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

mypy 使用子方法的名稱而不是父方法的通用簽名更新子方法的返回值

mypy 使用子方法的名稱而不是父方法的通用簽名更新子方法的返回值

慕田峪9158850 2023-08-22 16:38:35
我有一個Generic基類,它以一種方法返回自身(get_self)。我已經(jīng)打字暗示了這一點。然后,我有一個該基類的子類,它傳入Generic. 在那個兒童班里,我打電話給get_self。我想將類型提示更新為子類的名稱。不過,mypy==0.782正在報道error: Incompatible return value type (got "Foo[Bar]", expected "DFoo")  [return-value]。有什么辦法可以做到這一點嗎?**編輯**經(jīng)過進一步思考,我決定重新解釋這個問題。提前抱歉啰嗦了。基類 ( Foo) 有一個方法 ( get_self) 類型,暗示返回其自身的實例子類( DFoo)不重寫方法然后子類使用 ( get_self) 方法并且知道返回類型實際上是子類的 ( DFoo)但是,靜態(tài)類型檢查器(例如mypy:)不知道子類的方法實際上會返回子類的對象,因為它們正在使用基類中的類型提示get_self因此,如果不使用新類型提示在子類中重新聲明方法 (),我的問題可能無法實現(xiàn)。我可以使 的返回get_self成為 a TypeVar。然而,由于基類Foo已經(jīng)是 a Generic,所以目前這是不可能的,因為它需要python/typing Higher-Kinded TypeVars #548中提到的“Higher-Kinded TypeVars” 。示例腳本我希望這能澄清我想要表達的意思。from __future__ import annotationsfrom typing import Generic, TypeVar, castT = TypeVar("T")class Foo(Generic[T]):    def get_self(self) -> Foo[T]:        # Other stuff happens here before the return        return selfclass Bar:    passclass DFoo(Foo[Bar]):    def do_something_get_self(self) -> DFoo:        # mypy error: Incompatible return value type (got "Foo[Bar]",         # expected "DFoo")        return self.get_self()class DFooCast(Foo[Bar]):    def do_something_get_self(self) -> DFooCast:        # This works, but I don't like this method. I don't want to use `cast`        # all over the place.        return cast(DFooCast, self.get_self())class DFooNoUpdatedTypeHint(Foo[Bar]):    def do_something_get_self(self) -> Foo[Bar]:        # mypy doesn't error here, but later on it will raise an error         # when using method's added in Foo subclasses        return self.get_self()    def dfoo_adds_method(self) -> None:        """DFoo also has additional methods."""dfoo = DFooNoUpdatedTypeHint()dfoo.do_something_get_self().dfoo_adds_method()  # error: "Foo[Bar]" has no attribute "dfoo_adds_method"
查看完整描述

1 回答

?
HUWWW

TA貢獻1874條經(jīng)驗 獲得超12個贊

要解決這個問題,只需鍵入您的get_self函數(shù),def get_self(self: S) -> S其中 S 是某種類型 var。


然后,以下程序將干凈地鍵入檢查:


from __future__ import annotations


from typing import Generic, TypeVar, cast


T = TypeVar("T")


# This can also be just 'S = TypeVar("S")', but that would mean

# we won't be able to use any methods of Foo inside of get_self.

S = TypeVar("S", bound="Foo")



class Foo(Generic[T]):

? ? def get_self(self: S) -> S:

? ? ? ? return self


class Bar:

? ? pass



class DFoo(Foo[Bar]):

? ? def do_something_get_self(self) -> DFoo:

? ? ? ? return self.get_self()


? ? def dfoo_adds_method(self) -> None:

? ? ? ? pass



dfoo = DFoo()

dfoo.do_something_get_self().dfoo_adds_method()

這樣做的原因是因為它總是可以覆蓋self. 雖然它通常會自動給出當前類的類型,但 PEP 484 實際上并不要求您堅持使用此默認值。


因此,我們將其設為通用,以確保輸出類型始終與當前子類型匹配。

查看完整回答
反對 回復 2023-08-22
  • 1 回答
  • 0 關注
  • 1439 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號