我想对没有参数的函数使用类型提示
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
类型参数,第二个暗示传递的函数接收至少一个参数。
是否可以提示传递的函数不接收参数?
是否可以提示传递的函数不接收参数?
不带参数输入提示 a
Callable
的正确方法如下:
。具有位置参数类型Callable[[t1, t2, ..., tn], tr]
等且返回类型t1
的函数。 参数列表可能为空 n==0。tr
给出了一个明确的例子:
- Callable[[], int] is a subtype of Callable[[], float]. - Callable[[], Manager] is a subtype of Callable[[], Employee].
还有:
from typing import Callable def feeder(get_next_item: Callable[[], str]) -> None: # Body
内置名称
None
应与类型None区分开来(第一个用于访问第二个):
无
用作类型提示的内置名称
- 此类型具有单个值。有一个具有该值的“单个对象”。这个对象是通过内置名称
None
访问的。
None
的语法和含义是一种特殊情况:
“不使用”,PEP 484 在类型提示中使用时,表达式
None
被视为等同于
。 考虑到上述情况,以下两种方法(尝试编写不带参数的函数的type(None)
Callable
类型提示)是错误的,这并不奇怪:
Callable[[None], tr]
Callable[[type(None)], tr]
Callable
类型提示中的省略号仅表示:
,以下内容不太可能导致静态类型检查器因参数而发出任何警告:“可调用”,PEP 484 请注意,省略号两边没有方括号。
在这种情况下,回调的参数完全不受约束(并且关键字参数是可接受的)。由于它是
“不受约束”
Callable[..., tr]
Callable
、Any
和
...
(省略号)之间的关系。
“最后,如果您通过同样,注释中的裸 Callable 相当于 Callable[..., Any]
Any
类型”,PEP 484
main.py:13: 错误:“call_function”的参数 1 具有不兼容的类型“Callable[[int], int]”;预期“可调用[[],int]” 在 1 个文件中发现 1 个错误(检查了 1 个源文件)
中检查了您的示例,IDE 没有发出上述警告。请注意,我在
PyCharm 2020.2 Pro
PyCharm 使用自己的 PEP 484 实现,并且其静态类型检查器已知存在错误。 我认为你发现了一个错误...
最后注意:运行type(None)
NoneType
。在Python 3 中
NoneType
不公开供导入,尽管 在 Python 2 中它是可导入的。 编辑:出于某种原因,Python 3.10
types.NoneType