san*_*ers 12 python type-hinting pycharm python-asyncio
我试图确保函数参数是异步函数。所以我在玩以下代码:
async def test(*args, **kwargs):
pass
def consumer(function_: Optional[Coroutine[Any, Any, Any]]=None):
func = function_
consumer(test)
Run Code Online (Sandbox Code Playgroud)
但它不起作用。
在 pyCharm 中进行类型检查时出现以下错误:
Expected type 'Optional[Coroutine]', got '(args: Tuple[Any, ...], kwargs: Dict[str, Any]) -> Coroutine[Any, Any, None]' instead
Run Code Online (Sandbox Code Playgroud)
谁能给我一些提示如何解决这个问题?
Tom*_*dor 14
我帮不了你太多,特别是因为现在(PyCharm 2018.2)这个错误在 Pycharm 中不再出现。
目前,类型提示介于用于反射/内省的可靠元数据和接受用户输入的任何内容的美化注释之间。对于普通数据结构来说,这很棒(我的同事甚至制作了一个基于类型的验证框架),但事情变得更加复杂当回调和异步函数发挥作用时。
看看这些问题:
https://github.com/python/typing/issues/424(从今天开始) - 异步输入 https://github.com/python/mypy/issues/3028(从今天开始) - var-args 可调用打字
我会选择:
from typing import Optional, Coroutine, Any, Callable
async def test(*args, **kwargs):
return args, kwargs
def consumer(function_: Optional[Callable[..., Coroutine[Any, Any, Any]]] = None):
func = function_
return func
consumer(test)
Run Code Online (Sandbox Code Playgroud)
我不能保证他们的意思正是如此,但我的提示是这样构建的:
Optional- 当然,可以是None或者什么,在这种情况下:
Callable- 可以用 调用的东西(),...代表任何参数,它会产生:
Coroutine[Any, Any, Any]- 这是从OP复制的,非常笼统。您建议这function_可以被await-ed,但也可以接收send()由 所 -ed 的东西consumer,并被next()它 -ed/迭代。情况很可能是这样,但是……
如果它只是await-ed,那么最后一部分可能是:
Awaitable[Any],如果你确实在等待某事或
Awaitable[None],如果回调没有返回任何内容而您只是期望它await。
注意:你的consumer不是async。它不会真正是await你的function_,但要么yield from它,要么做一些loop.run_until_complete()或.create_task(),或.ensure_future()。
您正在寻找:
FuncType = Callable[[Any, Any], Coroutine[Any]]
def consumer(function_: FuncType = None):
Run Code Online (Sandbox Code Playgroud)
为什么类型是这样结构的?如果你声明一个 function async,你实际上做的是将它包装在一个带有给定参数的新函数中,它返回一个Coroutine.
由于这可能与来这里的某些人有关,因此这是一个await功能类型的示例:
OnAction = Callable[[Foo, Bar], Awaitable[FooBar]]
Run Code Online (Sandbox Code Playgroud)
它是一个接受Foo,Bar并返回一个FooBar
| 归档时间: |
|
| 查看次数: |
8691 次 |
| 最近记录: |