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

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

繞過(guò) mypy 的“模塊沒(méi)有屬性”的動(dòng)態(tài)屬性設(shè)置

繞過(guò) mypy 的“模塊沒(méi)有屬性”的動(dòng)態(tài)屬性設(shè)置

FFIVE 2022-09-06 18:05:50
我有以下代碼:a.pyclass Tags(enum.Flag):    NONE = 0    A = enum.auto()    B = enum.auto()    C = enum.auto()# Allow using tags.A instead of tags.Tags.Aglobals().update(Tags.__members__)但是當(dāng)我在其他文件上使用它時(shí),mypy(理所當(dāng)然地)無(wú)法識(shí)別屬性:import tagsprint(tags.A)  # Module has no attribute "A"在Python 3.6中,有沒(méi)有辦法繞過(guò)這個(gè)問(wèn)題?已知的解決方案(對(duì)于我的情況來(lái)說(shuō)還不夠好):每次使用時(shí)使用# type: ignoretags.A用tags.Tags.A在模塊級(jí)別使用(僅適用于 Python 3.7)__getitem__
查看完整描述

1 回答

?
largeQ

TA貢獻(xiàn)2039條經(jīng)驗(yàn) 獲得超8個(gè)贊

就個(gè)人而言,我要做的是修改我的導(dǎo)入以執(zhí)行:


from tags import Tags

..這將讓我通過(guò)以最小的大驚小怪在任何地方做來(lái)引用枚舉項(xiàng)目。Tags.A


但是,如果您真的想繼續(xù)從模塊命名空間中引用這些項(xiàng),一種方法是在中定義一個(gè)__getattr__函數(shù):tags.py


class Tags(enum.Flag):

    NONE = 0


    A = enum.auto()

    B = enum.auto()

    C = enum.auto()


def __getattr__(name: str) -> Tags:

    return Tags[name]

在運(yùn)行時(shí),如果您嘗試訪(fǎng)問(wèn)模塊對(duì)象中未直接定義的某些屬性,Python 將嘗試調(diào)用此函數(shù)。Mypy理解這個(gè)約定,并假設(shè)如果定義了,模塊是“不完整的”。因此,它將使用返回類(lèi)型作為您嘗試訪(fǎng)問(wèn)的任何缺失屬性的類(lèi)型。tags__getattr__


不過(guò),您可能仍然希望主要作為性能優(yōu)化來(lái)執(zhí)行,以跳過(guò)在運(yùn)行時(shí)實(shí)際調(diào)用函數(shù)的麻煩。globals().update(Tags.__members__)__getattr__


只有當(dāng) tags.py 只包含一個(gè)枚舉時(shí),此策略才真正有效 - 否則,您需要使返回類(lèi)型類(lèi)似于(這很笨拙)甚至只是(這失去了使用類(lèi)型檢查器的好處)。Union[Tags, MyOtherEnum]Any


這種策略還意味著 mypy 將無(wú)法通過(guò)考慮實(shí)際的枚舉值來(lái)進(jìn)行更復(fù)雜的類(lèi)型推斷和縮小范圍。不過(guò),這主要僅在您使用文本枚舉時(shí)才相關(guān)。


如果這些是問(wèn)題,您可能不得不訴諸于更暴力的方法,如下所示:


from typing import TYPE_CHECKING


class Tags(enum.Flag):

    NONE = 0


    A = enum.auto()

    B = enum.auto()

    C = enum.auto()


globals().update(Tags.__members__)


if TYPE_CHECKING:

    NONE = Tags.NONE

    A = Tags.A

    B = Tags.B

    C = Tags.C

該常量在運(yùn)行時(shí)始終為 false,但類(lèi)型檢查器認(rèn)為該常量始終為 true。TYPE_CHECKING


但是,如果您打算直接告訴mypy這些變體中的每一個(gè),那么您也可以跳過(guò)嘗試自動(dòng)更新全局變量并執(zhí)行此操作:


class Tags(enum.Flag):

    NONE = 0


    A = enum.auto()

    B = enum.auto()

    C = enum.auto()


NONE = Tags.NONE

A = Tags.A

B = Tags.B

C = Tags.C

顯然,像這樣重復(fù)兩次自己是相當(dāng)不理想的,但我不認(rèn)為有一個(gè)簡(jiǎn)單的方法可以解決這個(gè)問(wèn)題。您可以通過(guò)創(chuàng)建一個(gè)自動(dòng)生成的腳本來(lái)緩解這種情況,但這只是出于不同的原因,這也是相當(dāng)不理想的。tags.py


查看完整回答
反對(duì) 回復(fù) 2022-09-06
  • 1 回答
  • 0 關(guān)注
  • 159 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)