类型提示。如何暗示传递给函数的对象必须具有某种方法/属性访问权限?
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 版本的类型提示。更不用说像mypy
和 typing
模块反向移植到实现类型注释的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
【讨论】:
以上是关于类型提示。如何暗示传递给函数的对象必须具有某种方法/属性访问权限?的主要内容,如果未能解决你的问题,请参考以下文章