类型提示 可不带参数调用

Eli*_*lev 12 python type-hinting pycharm python-3.x nonetype

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

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
Run Code Online (Sandbox Code Playgroud)

我希望 PyCharm 在我传递带有参数的函数时标记该行。也尝试Callabale[[None], int]过 和Callabale[[...], int]。然而,第一个暗示传递的函数接收None类型参数,第二个暗示传递的函数接收至少一个参数。

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

bad*_*der 9

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

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

“基本构件”,PEP 483

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

一个明确的例子在:

“协变和逆变”,PEP 483

- Callable[[], int] is a subtype of Callable[[], float].
- Callable[[], Manager] is a subtype of Callable[[], Employee].
Run Code Online (Sandbox Code Playgroud)

还有:

“可调用”,PEP 484

from typing import Callable

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

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

3.2. 标准类型层次结构,数据模型

没有任何

  • 该类型具有单一值。有一个具有该值的对象。通过内置 name 访问None该对象。

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

“不使用”,PEP 484

当在类型提示中使用时,该表达式None被视为等效于type(None)

考虑到上述情况,以下两种方法(尝试编写Callable不带参数的函数的类型提示)是错误的,这并不奇怪:

Callable[[None], tr]
Callable[[type(None)], tr]
Run Code Online (Sandbox Code Playgroud)

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

“可调用”,PEP 484

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

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

Callable[..., tr]
Run Code Online (Sandbox Code Playgroud)

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

Any类型”,PEP 484

同样,注释中的裸 Callable 相当于 Callable[..., Any]



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

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

我在PyCharm 2020.2 Pro中检查了您的示例,IDE 没有发出上述警告。请注意,PyCharm 使用其自己的 PEP 484 实现,并且已知其静态类型检查器存在错误

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