1 回答
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
添加回答
舉報(bào)
