簡體   English   中英

類型提示回調函數

[英]Type hinting callback functions

我目前正在編寫一個使用事件和事件偵聽器的系統,並且在正確鍵入偵聽器的函數簽名時遇到了問題。 該程序的相關部分看起來類似於

from typing import Hashable, Callable
from collections import defaultdict

class System:
    def __init__(self):
        self.event_listeners = defaultdict(list)

    def add_event_listener(self, event: Hashable, listener: Callable):
        self.event_listeners[event].append(listener)

    def emit_event(self, event: Hashable, *args, **kwargs):
        for listener in self.event_listeners[event]:
            listener(self, *args, **kwargs)

    ...

除了System本身的實例之外,與事件相關的信息可以作為進一步的參數傳遞給事件偵聽器,並且信息的類型(參數的數量和類型)取決於特定的事件。

有沒有一種方法可以鍵入defaultdict實例和函數add_event_listener以反映每個事件都有一個特定的函數簽名Callable[[System, ...], object] ,這是預期的? 我考慮過如何使用ParamSpec來實現這一點,但到目前為止還沒有找到解決方案。

typing.Protocol 。協議。

from __future__ import annotations

from typing import Any, Hashable, Protocol
from collections import defaultdict


class EventListener(Protocol):
    def __call__(self, system: System, *args: Any, **kwds: Any) -> Any:
        ...


class System:
    def __init__(self) -> None:
        self.event_listeners: defaultdict[Hashable, list[EventListener]] = defaultdict(
            list
        )

    def add_event_listener(self, event: Hashable, listener: EventListener) -> None:
        self.event_listeners[event].append(listener)

    def emit_event(self, event: Hashable, *args: Any, **kwargs: Any) -> None:
        for listener in self.event_listeners[event]:
            listener(self, *args, **kwargs)

我在回答你標題中的問題Type hinting callback functions

使用Callablefrom typing import Callable )。

結構:

Callable[[<PARAMETER TYPES>], <RETURN TYPE>]

例子
def call(callback: Callable[[], int]) -> int:
  return callback()

def get1():
  return 1

def getA():
  return 'A'

call(get1) # ok
call(getA) # not ok
  • def foo(): pass的類型為Callable[[], None]
  • def foo(): return 1的類型為Callable[[], int]
  • def foo(): return '1'類型為Callable[[], str]
  • def foo(a: int): return '1'類型為Callable[[int], str]
  • def foo(a: int, b: str): return '1'類型為Callable[[int, str], str]

暫無
暫無

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

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