亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

使用類型注釋來縮小已聲明的 Python 變量的類型范圍

使用類型注釋來縮小已聲明的 Python 變量的類型范圍

鴻蒙傳說 2022-08-02 15:43:18
如何在Python中使用類型注釋來更改或縮小已聲明變量的類型,以使或其他類型感知系統理解新類型。pycharm例如,我可能有兩個類:class A:   is_b = False   ...class B(A):   is_b = True   def flummox(self):       return '?'以及其他地方的另一個功能:def do_something_to_A(a_in: A):    ...    if a_in.is_b:       assert isinstance(a_in, B)  # THIS IS THE LINE...       a_in.flummox()只要我有聲明,PyCharm就會明白我已經縮小到B類,而不是抱怨。沒有它,將出現諸如之類的錯誤/警告。asserta_in.flummox()a_in has no method flummox我的問題是,是否有PEP 484(或后繼者)方法來顯示(最初可能是A型或B型或其他東西)現在是B型而沒有斷言語句。該語句還給出了類型錯誤。a_inb_in : B = a_in在TypeScript中,我可以做這樣的事情:if a_in.is_b:   const b_in = <B><any> a_in;   b_in.flummox()// orif a_in.is_b:   (a_in as B).flummox()我不想使用斷言行有兩個主要原因是(1)速度對這部分代碼非常重要,并且每次運行該行時都有一個額外的調用會使其速度過慢,以及(2)禁止裸斷言語句的項目代碼樣式。is_instance
查看完整描述

1 回答

?
qq_花開花謝_0

TA貢獻1835條經驗 獲得超7個贊

只要您使用的是 Python 3.6+,就可以使用與在不初始化變量的情況下用于“聲明”變量類型的相同語法任意地“重新注釋”變量的類型(PEP 526)。


在您提供的示例中,以下代碼段具有您期望的行為:


def do_something_to_A(a_in: A):

    ...

    if a_in.is_b:

       a_in: B

       a_in.flummox()


我已經測試了PyCharm 2019.2是否正確檢測到了這種技術。


值得注意的是,這不會產生運行時成本,因為無論是否添加此注釋語句,都會生成相同的字節碼。鑒于以下定義,


def do_something_with_annotation(a_in: A): 

     if a_in.is_b: 

        a_in: B 

        a_in.flummox() 



def do_something_without_annotation(a_in: A): 

     if a_in.is_b: 

        a_in.flummox() 

dis 產生以下字節碼:


>>> dis.dis(do_something_with_annotation)

  3           0 LOAD_FAST                0 (a_in)

              2 LOAD_ATTR                0 (is_b)

              4 POP_JUMP_IF_FALSE       14


  5           6 LOAD_FAST                0 (a_in)

              8 LOAD_ATTR                1 (flummox)

             10 CALL_FUNCTION            0

             12 POP_TOP

        >>   14 LOAD_CONST               0 (None)

             16 RETURN_VALUE

>>> dis.dis(do_something_without_annotation)

  3           0 LOAD_FAST                0 (a_in)

              2 LOAD_ATTR                0 (is_b)

              4 POP_JUMP_IF_FALSE       14


  4           6 LOAD_FAST                0 (a_in)

              8 LOAD_ATTR                1 (flummox)

             10 CALL_FUNCTION            0

             12 POP_TOP

        >>   14 LOAD_CONST               0 (None)

             16 RETURN_VALUE

作為旁注,您還可以保留斷言語句,并通過調用帶有標志的解釋器在生產環境中禁用斷言。您的同事可能會或可能不會認為這更具可讀性,具體取決于他們對Python中類型提示的熟悉程度。-O


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

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號