![](/img/trans.png)
[英]Type hinting when numpy functions return pandas Series or DataFrames
[英]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
使用Callable
( from 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.