首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python:键入“Hint方法”的提示

Python:键入“Hint方法”的提示
EN

Stack Overflow用户
提问于 2021-09-07 15:35:27
回答 1查看 474关注 0票数 4

例如,我们有一个类:

代码语言:javascript
复制
class A:
    def send(msg: bytes) -> None:
        # implementation...
        pass
    
    def recv(n: int) -> bytes:
        # implementation
        pass

和一项职能:

代码语言:javascript
复制
def a(obj, n: int) -> None:
    received = obj.recv(n)
    obj.send(received)

很明显,不仅可以将类A的实例作为obj参数传递,还可以传递socket.socket的实例,可能还有其他类的实例,这些类具有recvsend实现。

一个注解/输入如何提示obj参数,这样它会说:

代码语言:javascript
复制
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]
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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__的作业成本法。

所以对于你的案子,可能是这样的:

代码语言:javascript
复制
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放在那里,如果这三个点很麻烦的话:)
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69091017

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档