类型错误:“ABCMeta”对象不可在 Callable 上订阅

Gur*_*aya 6 python type-hinting mypy

我对 python 3.8 和 mypy 协同工作的方式有疑问。考虑这段代码:

from collections.abc import Callable

def feeder(get_next_item: Callable[[], str]) -> str:
    return get_next_item()
Run Code Online (Sandbox Code Playgroud)

虽然 mypy 批准此代码,但使用 python 3.8 运行它会产生错误

Traceback (most recent call last):
  File "mypytest.py", line 3, in <module>
    def feeder(get_next_item: Callable[[], str]) -> str:
TypeError: 'ABCMeta' object is not subscriptable
Run Code Online (Sandbox Code Playgroud)

那么,让我们尝试其他方法: from collections.abc import Callable

def feeder(get_next_item: Callable) -> str:
    return get_next_item()
Run Code Online (Sandbox Code Playgroud)

此时,python3.8 可以正常运行,但是 mypy 会说

mypytest.py:4: error: Returning Any from function declared to return "str"
Run Code Online (Sandbox Code Playgroud)

除了在返回时使用 #type:ignore 之外,还有什么方法可以摆脱这个陷阱吗?提前致谢

Gur*_*aya 6

谢谢XtianP。只是为了记录,这段代码对我来说效果很好

from typing import Callable

def feeder(get_next_item: Callable[[], str]) -> str:
    return get_next_item()

print( feeder(lambda : 'Hi man') )
Run Code Online (Sandbox Code Playgroud)