自定义duck typ的Python类型注释

2024-06-01 04:36:57 发布

您现在位置:Python中文网/ 问答频道 /正文

Python的typing模块定义了许多duck类型,例如,typing.SupportsAbs来表示实现__abs__特殊方法的任何类型。在

是否可以定义自定义的duck类型,使我可以将它们用作有效的类型注释?在

例如,我希望能够注释一个参数应该是threading.Lock的duck类型等价物,即实现acquirerelease方法的任何对象。理想情况下,我可以将这样的参数注释为SupportsAcquireAndRequire或{},而不是{}。在


Tags: 模块对象方法locktyping类型参数release
1条回答
网友
1楼 · 发布于 2024-06-01 04:36:57

可以定义abstract base class (ABC)来指定接口:

from abc import ABCMeta, abstractmethod

class SupportsAcquireAndRequire(metaclass=ABCMeta):
    @abstractmethod
    def acquire(self):
        pass

    @abstractmethod
    def release(self):
        pass

    @classmethod
    def __subclasshook__(cls, C):
        for method in ('release', 'acquire'):
            for B in C.__mro__:
                if method in B.__dict__:
                    if B.__dict__[method] is None:
                        return NotImplemented
                    break
            else:
                return NotImplemented
        return True

这就是协议(如typing.SupportsAbs)的基本实现方式,尽管没有直接使用ABCMeta。在

通过给abca ^{} method,您可以在isinstance()和{}测试中使用它,这对于^{}这样的工具来说已经足够好了:

^{pr2}$

相关问题 更多 >