【问题标题】:Type hinting Callable with no parameters类型提示 Callable 无参数
【发布时间】:2021-01-25 14:42:08
【问题描述】:

我想对没有参数的函数使用类型提示

from typing import Callable

def no_parameters_returns_int() -> int:
    return 7

def get_int_returns_int(a: int) -> int:
    return a
    
def call_function(next_method: Callable[[], int]):
    print(next_method())

call_function(no_parameters_returns_int)  # no indication of error from IDE expected
call_function(get_int_returns_int)        # expected an indication of error from IDE

当我传递一个带有参数的函数时,我希望 PyCharm 能够标记该行。 还尝试了Callabale[[None], int]Callabale[[...], int]。但是第一个提示传递的函数接收None 类型参数,第二个提示传递的函数至少接收一个参数。

是否可以暗示传递的函数不接收参数?

【问题讨论】:

  • MyPy 检测正确:mypy-play.net/…
  • @jonrsharpe 谢谢,我切换到 Callable[..., int] 并没有收到提示错误,但是我预计运行时会出错
  • 运行时是什么意思? Python 不会在运行时进行类型检查,我假设您询问的是 PyCharm 未能发出警告。
  • @jonrsharpe 我的意思是,当 python 解释器执行 hof(one_arg) 行时,它应该会导致错误。但是我在 mypy 上打开了您的代码并将 Callable[[], int] 更改为 Callable[..., int] 现在没有错误。 mypy-play 只是测试类型检查吗?

标签: python python-3.x pycharm type-hinting nonetype


【解决方案1】:

是否可以暗示传递的函数不接收参数?

键入不带参数的Callable 提示的正确方法如下:

"Fundamental building blocks", PEP 483

Callable[[t1, t2, ..., tn], tr]。具有位置参数类型t1 等的函数,返回类型tr参数列表可能为空 n==0

下面给出了一个明确的例子:

"Covariance and Contravariance", PEP 483

- Callable[[], int] is a subtype of Callable[[], float].
- Callable[[], Manager] is a subtype of Callable[[], Employee].

还有:

"Callable", PEP 484

from typing import Callable

def feeder(get_next_item: Callable[[], str]) -> None:
   # Body

内置名称None应与类型None区分开来(第一个用于访问第二个):

3.2. The standard type hierarchy, Data Model

  • 这种类型只有一个值。 单个对象具有此值。这个对象是通过内置名称None访问的。

用作类型提示的内置名称None的语法和含义是一种特殊情况:

"Using None", PEP 484

在类型提示中使用时,表达式None 被认为等同于type(None)

考虑到上述情况,以下两种方法 - 尝试编写不带参数的函数的 Callable 类型提示 - 是错误的也就不足为奇了:

Callable[[None], tr]
Callable[[type(None)], tr]

Callable 类型提示中的省略号仅表示:

"Callable", PEP 484

请注意,省略号周围没有方括号。 回调的参数完全不受约束在这种情况下(关键字参数是可以接受的)。

由于它是“不受约束的”,因此以下情况不太可能导致静态类型检查器因参数而发出任何警告:

Callable[..., tr]

值得注意的是,CallableAny...(省略号)之间的关系。

"The Any type", PEP 484

同样,注解中的裸 Callable 等价于 Callable[..., Any]



最后,如果您通过MyPy 运行代码,实际上会发出预期的警告:

main.py:13:错误:“call_function”的参数 1 具有不兼容的类型“Callable[[int], int]”;预期“可调用 [[],int]” 在 1 个文件中发现 1 个错误(检查了 1 个源文件)

我在 PyCharm 2020.2 Pro 中检查了您的示例,并且 IDE 没有发出上述警告。请注意PyCharm uses its own implementation of PEP 484,以及它们的静态类型检查器has been know to have bugs

我认为你发现了一个错误......

【讨论】:

    猜你喜欢
    • 2012-11-18
    • 2020-03-11
    • 2023-02-01
    • 2020-01-24
    • 1970-01-01
    • 2016-01-27
    • 2023-04-06
    • 2012-01-21
    • 2019-11-10
    相关资源
    最近更新 更多