类型提示可不带参数调用

问题描述 投票:0回答:1

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

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
类型参数,第二个暗示传递的函数接收至少一个参数。

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

python pycharm python-typing nonetype
1个回答
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].

还有:

“可调用”,PEP 484

from typing import Callable

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

内置名称

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

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

  • 此类型具有单个值。有一个具有该值的“单个对象”。这个对象是通过内置名称None
    访问的。
用作类型提示的内置名称
None

的语法和含义是一种特殊情况:


“不使用”,PEP 484 在类型提示中使用时,表达式

None

被视为等同于

type(None)

考虑到上述情况,以下两种方法(尝试编写不带参数的函数的
Callable

类型提示)是错误的,这并不奇怪:

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

Callable

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


“可调用”,PEP 484 请注意,省略号两边没有方括号。

在这种情况下,回调的参数完全不受约束(并且关键字参数是可接受的)。

由于它是

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

Callable[..., tr]

值得注意的是,
Callable

Any

...
(省略号)之间的关系。

Any类型”,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 使用自己的 PEP 484 实现,并且其静态类型检查器已知存在错误 我认为你发现了一个错误...

最后注意:运行
© www.soinside.com 2019 - 2024. All rights reserved.