簡體   English   中英

PEP0484 類型提示:注釋給定類的參數,而不是實例

[英]PEP0484 Type Hinting: Annotating argument of given class, not instance

讓我先用一些例子來解釋。
假設有一個 Web API 客戶端模塊(MyAPIClient),一個將任意響應轉換為 Python 對象的映射器類(ObjectMapper),以及一個表示響應對象(User 和 Message)的類。

class User(MyResponse):
    def __init__(self, status: int, id: int, name: str) -> None:
        super().__init__(status)
        self.id = int
        self.name = name

class Message(MyResponse):
    def __init__(self, status: int, id: int, text: str) -> None:
        super().__init__(status)
        self.id = int
        self.text = name

class ObjectMapper(object):
    def __init__(self, mapping_class: ???) -> None:
        self.mapping_class = mapping_class

    def map(self, obj) -> MyResponse:
        return self.mapping_class(**kwargs)

class MyAPIClient(object):
    def __init__(self, ...) -> None:
        pass

    def get_current_user(...) -> User:
        self.request("GET", "/current_user", ObjectMapper(User))

    def get_message(...) -> Message:
        self.request("GET", "/message", ObjectMapper(Message))

    def request(method: str, endpoint: str, mapper: ObjectMapper):
        res = requests.request(...)
        return json.loads(response.content.decode(), object_hook=mapper.map)

如上例所示,ObjectMapper 接收一個名為“mapping_class”的參數。 不是類的實例,而是類本身,如MyAPIClient#get_current_userMyAPIClient#get_message 所示 我的問題是我應該如何在當前標記為“???”的ObjectMapper#__init__ 中注釋這個 mapping_class 在上面的示例中。

使用Type來引用類本身:

class ObjectMapper(object):
    def __init__(self, mapping_class: Type[MyResponse]) -> None:
        self.mapping_class = mapping_class

    def map(self, obj) -> MyResponse:
         return self.mapping_class(**kwargs)

類本身是可調用的,它返回該類的實例。 解決辦法可以是:

mapping_class: Callable[..., MyResponse]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM