类型提示。如何暗示传递给函数的对象必须具有某种方法/属性访问权限?

Posted

技术标签:

【中文标题】类型提示。如何暗示传递给函数的对象必须具有某种方法/属性访问权限?【英文标题】:Type hinting. How to hint that object passed to a function must have some method/attribute access? 【发布时间】:2020-05-31 14:27:57 【问题描述】:

请看一个使用 numpy doctstring 进行类型提示的示例:

def my_function(obj):
    """Do some work.

    Parameters
    ----------
        obj : Any class with `do_work()` method
    Returns
    -------
    None
    """
    time.sleep(5)

我想知道是否有办法告诉调用者函数需要具有do_work 方法的对象?有没有办法使用python3/mypy 类型提示或/和 numpy 文档字符串来指定此类类型提示?

【问题讨论】:

看来你的标签无效,python-2.7 没有对类型注解的语法支持 @Azat Ibrakov Python-2.7 具有文档字符串,因此具有 numpy 样式的文档字符串。 Pycharm 用于 python2 版本的类型提示。更不用说像 mypytyping 模块反向移植到实现类型注释的python2了 接受的答案使用 Python2.7 不支持的语法,这就是我所说的 @AzatIbrakov 不,您是说该问题的标签无效。接受的答案可以在 python 2.7 中与 mypy 一起使用而没有任何问题(尽管使用 typing_extensions 包)而且我的猜测是,如果我使用接受的 andswer 语法在 pycharm 中实现我自己的 typeshed 文件,我也会遇到零问题。这就是使接受的答案对 python 2 也有效的原因 【参考方案1】:

定义一个Protocol

import typing


class Worker(typing.Protocol):
    def do_work(self):
        pass


class SomeWorker:
    def do_work(self):
        print("Working...")


def my_function(obj: Worker):
    obj.do_work()


x = SomeWorker()
my_function(x)  # This will type check; `SomeWorker` doesn't have to inherit from Worker

【讨论】:

以上是关于类型提示。如何暗示传递给函数的对象必须具有某种方法/属性访问权限?的主要内容,如果未能解决你的问题,请参考以下文章

尝试将对象数组传递给函数时出错

方法的传递机制---引用类型传递

如何使用 PHPDoc 对 Callable 的参数进行类型提示?

Python - 如何传递给类对象的函数参数类型(打字)

java数组作为参数传入函数怎么让他不变化

如何将对象数据类型传递给类或函数?