例如,我们有一个类:
class A:
def send(msg: bytes) -> None:
# implementation...
pass
def recv(n: int) -> bytes:
# implementation
pass和一项职能:
def a(obj, n: int) -> None:
received = obj.recv(n)
obj.send(received)很明显,不仅可以将类A的实例作为obj参数传递,还可以传递socket.socket的实例,可能还有其他类的实例,这些类具有recv和send实现。
一个注解/输入如何提示obj参数,这样它会说:
obj type must possess methods send and recv
send method must be of type Callable[[bytes], None]
recv method must be of type Callable[[int], bytes]发布于 2021-09-07 16:03:29
您真正需要的是通过鸭型 (结构子类型)通过typing.Protocol。在这个列表中有一些例子。
协议类的定义如下: 类Proto(协议):def meth(self) -> int:. 此类类主要用于识别结构子类型(静态鸭子类型)的静态类型检查器,例如: 类C: def meth(self) -> int:返回0 def func(x: Proto) -> int:返回x.meth() func(C()) #通过静态类型检查
其中一个内置的例子是
class typing.SupportsIndex一个带有一个抽象方法__index__的作业成本法。
所以对于你的案子,可能是这样的:
from typing import Protocol
class SupportsSendReceive(Protocol):
def send(self, msg: bytes) -> None:
...
def recv(self, n: int) -> bytes:
...
def a(obj: SupportsSendReceive, n: int) -> None:
received = obj.recv(n)
obj.send(received)...并不意味着您必须在其中替换代码。它真的应该是这样的。或者你也可以把pass放在那里,如果这三个点很麻烦的话:)https://stackoverflow.com/questions/69091017
复制相似问题