python - 使用類作為其方法中參數的類型提示




python-3.x oop (2)

我下麵包含的代碼引發以下錯誤:

NameError: name 'Vector2' is not defined 

在這一行:

def Translate (self, pos: Vector2):

為什麼Python在 Translate 方法中無法識別我的 Vector2 類?

class Vector2:

    def __init__(self, x: float, y: float):

        self.x = x
        self.y = y

    def Translate(self, pos: Vector2):

        self.x += pos.x
        self.y += pos.y

因為當遇到 Translate (在編譯類主體時)時,尚未定義 Vector2 (當前正在編譯,尚未執行名稱綁定); Python自然會抱怨。

由於這是一種常見的情況(在該類的主體中鍵入一個類的類型),因此應使用對它的 前向引用 ,將其括在引號中:

class Vector2:    
    # __init__ as defined

    def Translate(self, pos: 'Vector2'):    
        self.x += pos.x
        self.y += pos.y

Python(以及符合 PEP 484 所有檢查程序)將理解您的提示並進行適當的註冊。 當通過 typing.get_type_hints 訪問 typing.get_type_hints 時,Python會意識到這 typing.get_type_hints

from typing import get_type_hints

get_type_hints(Vector2(1,2).Translate)
{'pos': __main__.Vector2}

自Python 3.7起已更改。 請參閱 下面的abarnert的答案 。


您要求的功能稱為正向(類型)引用,並且從3.7(在 PEP 563中 )起已添加到Python中。 1 因此,這現在有效:

from __future__ import annotations
class C:
    def spam(self, other: C) -> C:
        pass

注意 __future__ 語句 直到4.0 才需要。

不幸的是,在Python 3.6及更早版本中,此功能不可用,因此您必須使用字符串註釋,如 Jim Fasarakis Hilliard的答案所述 。

Mypy已經支持前向聲明,即使在Python 3.6下運行時也是如此-但是如果靜態類型檢查器說您的代碼很好,但是當您嘗試實際運行它時,解釋器會引發 NameError ,這對您沒有多大幫助。

1.這已在 PEP 484中 討論為可能的功能,但在人們對在批註中使用前向聲明有更多經驗之後,將其推遲到以後。 PEP 563 / Python 3.7就是“後來的”。





type-hinting